我试图与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只运行一次,如果项目顺序颠倒则运行两次,为什么?
答案 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()
循环更能控制迭代,因为您可以break
,continue
或修改迭代随时索引,.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。