JavaScript对象与数组查找性能

JavaScript对象与数组查找性能,javascript,Javascript,在JavaScript对象中通过键检索值与在单个JavaScript对象数组上迭代之间的性能差异是什么 在我的例子中,我有一个包含用户信息的JavaScript对象,其中键是用户的ID,值是每个用户的信息 我问这个问题的原因是因为我想使用angular ui select模块来选择用户,但我不能将该模块与Javascript对象一起使用-它需要一个数组 从按键查找切换到按迭代查找,我要牺牲多少 按键: var user = users[id]; 通过迭代 var user; for (var

在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;
  }
}
var用户;
对于(var i=0;i
这个问题的答案取决于浏览器,然而,在jsperf.com上有一些关于这个问题的性能测试。这还取决于数据的大小。通常,当您有大量数据时,使用对象键值对会更快。对于小型数据集,阵列可以更快

根据目标项在数组中的位置,数组搜索将具有不同的性能。对象搜索将具有更一致的搜索性能,因为键没有特定的顺序

此外,在数组中循环比在键中循环要快,因此,如果您计划对所有项执行操作,最好将它们放入数组中。在我的一些项目中,我同时做这两件事,因为我需要执行批量操作和快速查找标识符

测试:


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

  • 集合的大小-当搜索最后一个键时,数组将变慢,并且数组相当长
  • 元素可以自己重复吗?如果是,则需要一个数组。如果否:您需要一个字典(map),或者需要编写一个add方法,在处理大型列表时,每次add都会迭代您的数组并找到可能的重复项,这可能会带来麻烦
  • 平均密钥使用率-如果请求最多的用户ID位于列表的末尾,您将失去性能
在您的示例中,map将是一个更好的解决方案。 其次,您需要在您的代码中添加一个中断:)

var用户;
对于(var i=0;i

或者您将失去性能:)

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

不要将JavaScript对象与JSON混淆!这很不公平:线性搜索(你的数组循环)与几乎随机访问(哈希表实现)这里有一个快速的基准,它可以帮助你:这是一个过时的解决方案,你总是使用:users.find(user=>user.id===id)这是一个固定的基准:@Hatch,但当你需要支持较旧的浏览器时就不需要了。您将需要一个用于该方法的函数和一个用于
=>
箭头函数的transpiler。从第二个链接来看,for循环似乎比其他任何循环都快得多。。我假设在对象中直接查找(知道键)是最快的..嗯,红色测试结果(最快的一个)是最好的数组搜索。搜索的项目是第一个,当然它很快。如果查看最坏的情况,即该项在数组中最后一个存在,则速度要慢得多。对象搜索具有与位置无关的相当一致的查找性能。使用适当的性能解决方案修复了您的测试:正如Ole提到的,对于大量项目,对象查找的性能比在数组中循环要高效得多,即使使用性能最高的数组函数也是如此。下面是一个测试,在一个数组中有10000个项目,每个项目中有10个键/值对,显示对象相对于数组的改进>1000倍:。我的测试代码不是最漂亮的;如果我错过了什么,请告诉我。
var user;

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