搜索javascript对象或对象数组效率最高

时间:2018-04-23 07:53:10

标签: javascript arrays object

我有一个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}},...}

2 个答案:

答案 0 :(得分:1)

  

使用像

这样的对象会更有效率

如果您按id查找,是的,几乎可以肯定,但您的示例还有一层额外的{},您想要删除:

var objectObjs = {
    abc123:{ id:abc123, radius:5.0},
    def235:{ id:def235, radius:2.5},
    //...
};

JavaScript对象经过高度优化,可以按名称进行属性检索。

另一种选择是使用Map,它也针对按键检索进行了优化。

如果您使用对象,最好通过Object.create(null)创建它,这样它就不会继承Object.prototype属性。你可能不会像idtoString一样查找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) {
  // ..
}