如何在forEach循环中返回一个元素

时间:2016-11-24 07:38:37

标签: javascript

在我的代码中,我有一个如下所示的数组:

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语句不起作用?

5 个答案:

答案 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,则下一次评估将不会继续!