我有输入 JS 函数的名称的实时提要,我想创建一个对象,例如:
var renderObj= {
{"name": "test1", "size": 3938},
{"name": "test2", "size": 3812},
{"name": "test3", "size": 6714}
};
所以renderObj
是空的开始。每次输入名称时,我都需要检查它是否存在于对象中。如果是,请更新大小。
任何人都可以建议吗?
我有输入 JS 函数的名称的实时提要,我想创建一个对象,例如:
var renderObj= {
{"name": "test1", "size": 3938},
{"name": "test2", "size": 3812},
{"name": "test3", "size": 6714}
};
所以renderObj
是空的开始。每次输入名称时,我都需要检查它是否存在于对象中。如果是,请更新大小。
任何人都可以建议吗?
您不能在对象中包含未命名的项目。改用数组:
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;
}
这就是您可能想要的结构:
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..
我会将名称映射与对象并排保存,并使用一个函数来检查该映射:
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 );
}