Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么node.js forEach中的return不能像continue一样工作_Javascript_Node.js_Asynchronous - Fatal编程技术网

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";
})