Javascript 为什么node.js forEach中的return不能像continue一样工作
我正试图做与之相反的事Javascript 为什么node.js forEach中的return不能像continue一样工作,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正试图做与之相反的事 基于此运行代码时,if只运行一次,如果项目顺序颠倒,它将运行两次,为什么?拼接foreach循环中使用的数组可能会导致项目跳过,为了避免这种情况,我在数组切片的结果上运行了forEach。改变当前数组的常用解决方案是使用for循环,并从后向前进行迭代: var arr=[{id:231},{id:343}]; 对于(变量i=arr.length-1;i>=0;i--){ 如果(arr[i].id==“231”){ 阵列拼接(i,1); } } log(JSON.stri
基于此运行代码时,if只运行一次,如果项目顺序颠倒,它将运行两次,为什么?拼接foreach循环中使用的数组可能会导致项目跳过,为了避免这种情况,我在数组切片的结果上运行了forEach。改变当前数组的常用解决方案是使用
for
循环,并从后向前进行迭代:
var arr=[{id:231},{id:343}];
对于(变量i=arr.length-1;i>=0;i--){
如果(arr[i].id==“231”){
阵列拼接(i,1);
}
}
log(JSON.stringify(arr))代码>拼接将弄乱数组的大小,而您的循环将给出错误的结果。您应该使用filter
来执行此操作
arr = arr.filter((item)=>{
return item.id !== "231";
})
是的,它解决了问题,这就是答案的原因。@AndrewLi return不应该也不会跳过任何项目,这是导致问题的拼接。如果它跳过原始数组中的项目,它不会也跳过您使用slice制作的副本中的项目吗?否,因为循环在切片副本上运行,并且对原始副本进行了修改。虽然这也可以,但这是一个代码段,我不想为了避免合并问题而做太多更改,拼接对我来说是一个更好的选择。@DavidKohen-说真的,前两个选项中的任何一个都会导致代码更改过多,从而无法避免对数组进行不必要的复制?或者,如果仍要复制数组,请使用.filter()
。不,通常的解决方案是不这样修改数组。@torazaburo-这完全取决于您的应用程序和情况。有时复制是合适的,有时变异是合适的。每一个都有非常合理的理由——这完全取决于设计和情况。理想情况下,不会使用id进行暴力搜索,但无论如何都会使用地图,但这些是我们在这里处理的牌。@torazaburo-长度由数组自动调整,并在每次迭代for
循环之前进行比较,因此不会超出数组的末尾。如果将长度缓存在一个单独的变量中(我在这里故意不这么做),那么也必须进行更新。Uhhh,.indexOf()
可以在对象数组中找到一个对象。当然可以,但为什么不return item.id!==231;
,或者更好的是,arr.filter(item=>item.id!==231)
?仅供参考,“231”
是字符串,而不是数字。@jfriend00对此表示抱歉。您的代码有语法错误,无法运行。无论如何,不要尝试在中途修改阵列。这不会有好的结局。相反,可以使用过滤器创建一个不包含不需要的项的新数组,.forEach()
提供了第二个参数,即索引。无需使用.indexOf()
再次查找元素。首选filter()
而不是splice()
:var filtered=arr.filter(item=>item.id!=“231”)
arr = arr.filter((item)=>{
return item.id !== "231";
})