JavaScript对象与阵列查找性能

时间:2014-10-14 05:45:17

标签: javascript

在JavaScript对象中按键检索值与在单个JavaScript对象数组上进行迭代之间的性能差异是什么?

就我而言,我有一个包含用户信息的JavaScript对象,其中键是用户的ID,值是每个用户的信息。

我问这个的原因是因为我想使用angular-ui-select模块来选择用户,但是我不能将该模块与Javascript对象一起使用 - 它需要一个数组。

如果有的话,我是通过从按键查找切换到迭代查找来牺牲多少?

按键:

var user = users[id];

迭代

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) { 
    user = users[i]; break;
  }
}

3 个答案:

答案 0 :(得分:9)

这个问题的答案取决于浏览器,但是,jsperf.com上就此问题进行了一些性能测试。它还取决于您的数据大小。通常,当您有大量数据时,使用对象键值对会更快。对于小型数据集,数组可以更快。

阵列搜索将具有不同的性能,具体取决于目标项目在数组中的位置。对象搜索将具有更一致的搜索性能,因为密钥不具有特定顺序。

同时循环遍历数组比循环throigh键更快,因此如果您计划对所有项执行操作,将它们放在数组中是明智的。在我的一些项目中,我同时做这两件事,因为我需要进行批量操作和识别器的快速查找。

测试:

http://jsben.ch/#/Y9jDP

答案 1 :(得分:2)

此问题涉及所有编程语言。这取决于很多因素:

  • 你的集合的大小 - 在你搜索最后一个密钥时,数组会变慢,而且数组很长
  • 可以让元素自我重复 - 如果是的话,比你需要一个数组。如果不是:你需要一个字典(map),或者你需要编写一个add方法,每个add都会迭代你的数组并找到可能的重复 - 这在处理大型列表时很麻烦
  • 平均密钥使用情况 - 如果请求最多的userId位于列表末尾,您将失去性能。

在您的示例地图中,这将是一个更好的解决方案。 其次,你需要为你的代码添加一个中断:)

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) {
     user = users[i]; break;
  }
}

或者你会失去表现:))

答案 2 :(得分:-3)

关联数组比带有编号索引的数组要慢得多,因为关联数组通过字符串比较来工作,这比数字比较慢得多!