【问题标题】:JavaScript - setting object key by nameJavaScript - 按名称设置对象键
【发布时间】:2012-05-07 11:05:23
【问题描述】:

我有一个输入 JS 函数的名称的实时提要,我想创建一个对象,例如:

var renderObj= {
{"name": "test1", "size": 3938},
{"name": "test2", "size": 3812},
{"name": "test3", "size": 6714}
};

所以renderObj 开始是空的。每次出现名称时,我都需要检查它是否存在于对象中。如果是,请更新大小。

谁能给点建议?

【问题讨论】:

标签: javascript object key


【解决方案1】:

您不能在对象中包含未命名的项目。改用数组:

var renderObj = [
  {"name": "test1", "size": 3938},
  {"name": "test2", "size": 3812},
  {"name": "test3", "size": 6714}
];

遍历数组以检查名称是否存在:

var index = -1;
for (var i = 0; i < renderObj.Length; i++) {
  if (renderObj[i].name == name) {
    index = i;
    break;
  }
}

现在检查结果。如果名称尚不存在,我假设您想添加一个对象。您没有说您希望如何更新大小,所以我假设您想将新值添加到以前的值:

if (index == -1) {
  renderObj.push({ name: name, size: size });
} else {
  renderObj[index].size += size;
}

【讨论】:

  • 这是理想的。是的,在这个例子中,数组更适合我需要的东西。感谢您的帮助!本。
【解决方案2】:

这就是你可能想要的结构:

var renderObj= {
    "test1" : 3938,
    "test2" : 3812,
    "test3" : 6714
};

当然你可以有一个完整的对象,比如:

var renderObj= {
    "test1" : {"size": 3938},
    "test2" : {"size": 3812},
    "test3" : {"size": 6714}
};

关键是你的对象的属性是你的“关键”,所以你可以很容易地检查一个名字是否在你的renderObj中:

function addItem(obj, name) {
   var value = obj[name]
   if (typeof value === "number")
       obj[name] = value + 1
   else
       obj[name] = 1
}

如果是更复杂的对象:

function addItem(obj, name) {
   var value = obj[name]

   if (value)
       value.size++ 
   else
       obj[name] = {"size": 1}
}

然后:

addItem(renderObj, "test1")
addItem(renderObj, "test4")
// etc..

【讨论】:

    【解决方案3】:

    我会在对象旁边保留一张名称地图,以及检查该地图的函数:

    var renderObj = [
          { name: "test1", size: 3938},
          { name: "test2", size: 3812},
          { name: "test3", size: 6714}
        ]
      , nameMap = {}
      ;
    
    function notAlreadyInrenderObj( newObj ){
       //IE7 and above, use typeof ... === "undefined" if you need lower browsers
      return ( undefined === nameMap[newObj.name] );
    }
    

    然后添加新对象:

    if( notAlreadyInrenderObj( ojb ) ){
      nameMap[newObj.name] = renderObj.length; //in case you need to find it quickly later
      renderObj.push( ojb );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多