如何在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);
使用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,在循环中再接下来的评测将不会进行!
是的,谢谢你的真棒回答! :) –