我有一个对象数组,在某些时候填充了“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”不为空的索引的最快/最聪明的方法是什么?有一个更好的方法吗?理想的性能应该是具有大量对象的列表(即数千个对象)。
答案 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
循环,没有真正的优势)。 :\