如何在foreach循环返回元素

如何在foreach循环返回元素

问题描述:

在我的代码,我有一个数组,它是象下面这样:如何在foreach循环返回元素

localStroge_Procrastinator_tasks = [object , object, object] 

现在我想使用foreach循环数组在迭代和返回时的标识对象与我提供的ID相匹配,让我列出代码以使我的示例清晰。

storeRelevantObj = localStroge_Procrastinator_tasks.forEach(function(e, i){ 
    if (e.task_Id === task_Id) { 
     return e; 
    } 
}); 

但wheni运行代码即使如果返回conditon传球和E,storeRelevantObj仍然是空的,为什么呢?为什么返回声明不起作用?

不要使用forEach()过滤,使用filter()代替:

var storeRelevantObj = localStroge_Procrastinator_tasks.filter(function(e) { 
    return e.task_Id === task_Id; 
})[0]; 

如果你不介意的IE浏览器的支持,您可以使用find()方法时返回的第一个元素满足条件(它也是更高性能的,因为它可以在第一次匹配时立即返回):

var storeRelevantObj = localStroge_Procrastinator_tasks.find(function(e) { 
    return e.task_Id === task_Id; 
}); 

另外,如果你的目标ES6或使用transpiler(如Babel),您的谓语可以使用Arrow Function表示:

var storeRelevantObj = localStroge_Procrastinator_tasks.find(e => e.task_Id === task_Id); 
+0

是的,谢谢你的真棒回答! :) –

使用Array#filter,而不是Array#forEach

随着Array#forEach,空数组可以初始化并做Array#push如果条件得到满足!

使用Array#filter,新阵列与所有元素通过测试返回!

var storeRelevantObj = localStroge_Procrastinator_tasks.filter(function(e, i) { 
    return e.task_Id === task_Id; 
}); 

这里需要使用过滤器功能。因为你想返回一个数组。您正在使用的forEach将继续覆盖storeRelevantObj的值。

代码:

storeRelevantObj = localStroge_Procrastinator_tasks.filter((e, i)=>{ return (e.task_Id === task_Id); });

如果你需要使用的forEach,你应该这样做:

localStroge_Procrastinator_tasks.forEach((e, i)=>{ if (e.task_Id === task_Id){ storeRelevantObj.push(e)
}; });

使用Array#filter,会返回一个新的数组。你也可以使用Array#reduce
var storeRelevantObj = localStroge_Procrastinator_tasks.reduce(function(prev, cur) { return prev || cur.task_id == task_id; }, false);

但是,这只会返回第一个匹配的值。而filter将返回一个具有所有匹配值的数组

以下documentation指出,除了抛出异常外,没有办法从forEach。如果你需要这样的行为,它也会提到你的选择!

你也可以使用一个简单的for循环方式如下:

localStroge_Procrastinator_tasks = [object , object, object]; 

var i, l, match; 


l = localStroge_Procrastinator_tasks.length; 
for(i=0;!match&&i<l;++i){ 
    match = localStroge_Procrastinator_tasks[i].task_Id === task_Id; 
} 

如果匹配设置为true,在循环中再接下来的评测将不会进行!