我正在开展一个项目,我需要从一个巨大的用户数据列表中提取被排除用户的列表。这让我想知道在for loop
中使用带有排除ID的双array
是否更快。或者,如果将id放在对象属性中并使用.hasOwnProperty()
更快。
var mainList = LARGE JSON OBJECT OF DATA.
var eArray = ["123456","234567","345678","456789","012345"];
var eObject = {"123456":"0","234567":"0","345678":"0","456789":"0","012345":"0"};
使用Double For Loop
方法:
for(i=0; i < mainList.length; i++){
for(j=0; j < eArray.length; j++){
if(mainList[i]['id'] === eArray[j]){
//Do Something
}
}
}
使用.hasOwnProperty()
方法:
for(i=0; i < mainList.length; i++){
if(eObject.hasOwnProperty(mainList[i]['id'])){
//Do Something
}
}
我意识到还有其他方法可以使循环更快,比如在变量中存储长度。我试图简化这个。
感谢您提供任何信息。
答案 0 :(得分:6)
你错过了第三种更快的选择。如果您没有以任何方式修改Object.prototype
,并且ID不太可能是原型值(如valueOf
等),您可以简单地使用for
循环像这样:
for(var i=0; i < mainList.length; i++)
{
if (eObject[mainList[i].id] !== undefined)
{//or typeof eObject[mainList[i].id] !== 'undefined'
//do something
}
}
检查the updated JSPref,这是到目前为止的最快方式(双循环为57,252,850 ops / sec vs 17,503,538 ops / sec)
答案 1 :(得分:3)
如果你仔细想想,.hasOwnProperty()
方法会更快,因为它只使用1 for loop
。
我实际上有点惊讶。我期待双循环更慢。但我想你无法估计for loop
的速度。
虽然这对我来说似乎是最慢的,但这实际上最终成为7,291,083 ops/sec
我可以看到这会慢一些,因为函数比语句慢。这个座位在1,730,588 ops/sec
@Geuis回答包括if..in语句,并且我认为我会测试速度似乎最快,但在2,715,091 ops/sec
的长度仍然没有击败for循环。
For循环很快。双循环运行速度比使用.hasOwnProperty()
快 4倍,并且比使用if..in
条件快<3> 。但是,表现并不明显;所以速度真的非常重要,你需要使事情复杂化。在我看来,if..in
方法是可行的方法。
Test this yourself。我正在使用Google Chrome 28
。
<强>更新强>
请务必注意,使用for..in
声明可以获得最佳效果。
答案 2 :(得分:1)
修改以显示未来互联网浏览器的正确代码:访问http://jsperf.com/stackoverflow-for-vs-hasownproperty/5进行比较
var testVal = 'BigBrownFox',
arr = [1,4,'asd','BigBrownFox',9];
if( arr.indexOf('testVal') > -1 ){
//do something
}
用于测试另一个数组中存在的值数组:
var testVal = ['BigBrownFox'],
arr = [1,4,'asd','BigBrownFox',9];
for(var i=0, len=testVal.length; i<len; i++){
if( arr.indexOf(testVal[i]) > -1 ){
//do something
}
}
实际上,你在两种情况下的做法都略有偏差。
如果使用数组,只需使用indexOf
功能。如果测试值存在,它将返回其索引。否则,如果找不到则为-1。根本不需要循环。
如果是对象,则不要使用.hasOwnProperty。是的,它可以满足您的需求,但它过于复杂且速度较慢,因为您正在进行函数调用。
只需使用
var eObject = {"123456":"0","234567":"0","345678":"0","456789":"0","012345":"0"};
if( '234567' in eObject ){ //do something }
希望这有帮助。
答案 3 :(得分:0)
在chrome中,最快的循环是
在旧版/其他浏览器中,最快的是while - 循环。
特别是如果你缓存长度。(如果mainList很大则非常重要)
因为我看到你在eObject中只有字符串我也建议使用(eObject[mainList[i].id])
比(eObject[mainList[i].id] !== undefined)
var i=mainList.length;
while(i--){
if (eObject[mainList[i].id]) {
//do something
}
}