使用javascript在列表中查找对象的第一个出现索引的最快/最有效的方法是什么?

时间:2014-10-15 20:32:52

标签: javascript

我有一个对象数组,在某些时候填充了“a”键,并继续为数组中的所有后续对象填充。获得该索引的最快,最有效的方法是什么?

: [{a:null,),{a:null,..},{a:"Value",..},,{a:"Value",..}]

我目前的方法是:

for(var i = 0; i < list.length; i++) {
   if(list[i].a)
      return i;
}
return null;

找到“a”不为空的索引的最快/最聪明的方法是什么?有一个更好的方法吗?理想的性能应该是具有大量对象的列表(即数千个对象)。

2 个答案:

答案 0 :(得分:0)

我认为有两种方法可以更好/更快地完成这项工作,但他们都绕过了你的问题。

在第一种情况下,您存储一个变量,告诉您第一个值是什么;您可以在将值初始化为非null时执行此操作,也可以在第一次执行此操作之后执行此操作以保存自己的未来演练。

在第二种情况下,您永远不会初始化数组的空值,而零元素始终是您想要的元素。

答案 1 :(得分:0)

  

获得该索引的最快,最有效的方法是什么?

关于效率,你已经非常接近最佳状态了。 for循环很快,一旦找到匹配,你就已经完成了迭代,这是你所希望的。

然而,正如评论中所提到的,可以缓存.length值,这在技术上 更快,但它是premature / mico的定义-优化。但是,为了彻底,这看起来像这样:

for(var i = 0, len = list.length; i < len; i++) {
    if(list[i].a) return i;
}
return null;

我之前在评论中提到这种方法“真的不是那么糟糕......只是冗长。”,你问它是否可能是“unverbose [d]”(很棒的话,顺便说一下:))。 TBH,我认为没有什么特别好的方法可以做到这一点。没有任何内置的“功能”方法(例如,forEach()filter()等)允许早期爆发,indexOf()不支持这种方法比较试验。

关于我能提供的最好的东西是对未来的某种希望。 ES6引入了findIndex()方法,当与ES6 fat-arrow functions结合使用时,可以使用以下内容:

var idx = list.findIndex(item => item.a !== null);

在此之前,我们基本上只有for个循环(或者我认为while循环,没有真正的优势)。 :\