我有一个JavaScript对象数组
var arrayObjs = [
{ id:abc123, radius:5.0},
{ id:def235, radius:2.5},...]
我一直在使用for循环来查找id = def235的特定对象,使用像
这样的对象会更有效吗var objectObjs = {
{ abc123:{ id:abc123, radius:5.0}},
{ def235:{ id:def235, radius:2.5}},...}
答案 0 :(得分:1)
使用像
这样的对象会更有效率
如果您按id
查找,是的,几乎可以肯定,但您的示例还有一层额外的{}
,您想要删除:
var objectObjs = {
abc123:{ id:abc123, radius:5.0},
def235:{ id:def235, radius:2.5},
//...
};
JavaScript对象经过高度优化,可以按名称进行属性检索。
另一种选择是使用Map
,它也针对按键检索进行了优化。
如果您使用对象,最好通过Object.create(null)
创建它,这样它就不会继承Object.prototype
属性。你可能不会像id
或toString
一样查找valueOf
,但仍然...... :-)所以也许:
var objectObjs = Object.assign(Object.create(null), {
abc123:{ id:abc123, radius:5.0},
def235:{ id:def235, radius:2.5},
//...
});
从数组中创建该对象也是微不足道的,以避免键入id
两次以及引入错误的机会:
var arrayObjs = [
{ id:abc123, radius:5.0},
{ id:def235, radius:2.5},/*...*/];
var objectObjs = Object.create(null);
arrayObjs.forEach(entry => { objectObjs[entry.id] = entry; });
答案 1 :(得分:0)
为了好玩,我试了一下:https://jsperf.com/accessor-test-loop-vs-object
当然,正如T.J.描述 - 通过对象属性访问要快得多。有趣的是,在Chrome
上,差异远大于Firefox
,正如我刚试过的那样。尝试运行Chrome和Firefox或Edge的测试。
var arrayObjs = [
{ id:'abc123', radius:5.0},
{ id:'def235', radius:2.5}
];
for (var i = 0; i < arrayObjs.length; i++) {
if (arrayObjs[i].id == 'def235') {
// found it
break;
}
}
.. .. VS
var objectObjs = {
abc123:{ id: 'abc123', radius: 5.0},
def235:{ id: 'def235', radius: 2.5}
}
var found = !!objectObjs.def235;
if (found) {
// ..
}