在我的代码中,我有一个如下所示的数组:
localStroge_Procrastinator_tasks = [object , object, object]
现在我想使用forEach循环迭代数组,并在对象的id与我提供的id匹配时返回,让我列出代码以使我的示例清晰。
storeRelevantObj = localStroge_Procrastinator_tasks.forEach(function(e, i){
if (e.task_Id === task_Id) {
return e;
}
});
但即使if条件通过且e被返回,当我运行代码时,storeRelevantObj
仍然为空,为什么?为什么return语句不起作用?
答案 0 :(得分:2)
请勿使用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或使用转发器(例如Babel),您的谓词可以使用Arrow Function表示:
var storeRelevantObj = localStroge_Procrastinator_tasks.find(e => e.task_Id === task_Id);
答案 1 :(得分:1)
使用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;
});
答案 2 :(得分:0)
您需要在此处使用过滤功能。因为你想返回一个数组。您当前使用的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)
};
});
答案 3 :(得分:0)
使用Array#filter
将返回一个新数组。您也可以使用Array#reduce
。
var storeRelevantObj = localStroge_Procrastinator_tasks.reduce(function(prev, cur) {
return prev || cur.task_id == task_id;
}, false);
然而,这只会返回第一个匹配的值。虽然filter
将返回一个包含所有匹配值的数组
答案 4 :(得分:0)
以下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,则下一次评估将不会继续!