为什么在node.js中返回forEach不能继续工作

时间:2017-01-12 17:16:35

标签: javascript node.js asynchronous

我试图与How to short circuit Array.forEach like calling break?

相反
arr = [{id:"231"}, {id:"343"}];
arr.forEach(function (item) {
    if (item.id === "231") {
        arr.splice(arr.indexOf(item), 1);
        return;
    }
});

当基于此运行代码时,if只运行一次,如果项目顺序颠倒则运行两次,为什么?

3 个答案:

答案 0 :(得分:1)

改变当前数组的常用解决方案是使用for循环并从后向前执行迭代:



var arr = [{id:"231"}, {id:"343"}];
for (var i = arr.length - 1; i >= 0; i--) {
    if (arr[i].id === "231") {
        arr.splice(i, 1);
    }
}

console.log(JSON.stringify(arr));




这样,当你splice()当前项时,你只是改变你已经访问过的数组元素的索引,并且迭代不受影响。

也可以从开始到结束运行for循环,并在拼接出元素后纠正索引值。



var arr = [{id:"231"}, {id:"343"}];
for (var i = arr.length - 1; i >= 0; i--) {
    if (arr[i].id === "231") {
        arr.splice(i, 1);
    }
}

console.log(JSON.stringify(arr));




请记住,普通for循环总是让您比。forEach()循环更能控制迭代,因为您可以breakcontinue或修改迭代随时索引,.forEach()无法做到的事情。

如果您确定最终结果是一个新数组,那么.filter()对您来说非常容易,因为它就是为它构建的。



var arr = [{id:"231"}, {id:"343"}];
arr = arr.filter(function(item) {
    return item.id !== "231";
});

console.log(JSON.stringify(arr));




或者,在ES6中:



var arr = [{id:"231"}, {id:"343"}];
arr = arr.filter(item => item.id !== "231");

console.log(JSON.stringify(arr));




答案 1 :(得分:1)

splice会弄乱数组的大小,你的循环会给出错误的结果。您应该使用filter来执行此操作。

arr = arr.filter((item)=>{
     return item.id !== "231";
})

答案 2 :(得分:0)

拼接foreach循环中使用的数组可能导致跳过项目,为避免这种情况,我在数组上的切片结果上运行了forEach。