【问题标题】:what is the best way to delete elements at execution time of a foreach in javascript? [duplicate]在javascript中的foreach执行时删除元素的最佳方法是什么? [复制]
【发布时间】:2021-03-31 20:05:51
【问题描述】:

let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]

aUsers.forEach((user,i)=>{
  if(user.name=="cell" || user.name=="freezer"){
    aUsers.splice(i,1); //this causes a problem..
  }
})

console.log(aUsers);

我知道我应该使用filter,但我不知道如何在运行foreach 的同时让我的元素成为removed

我会知道如何解决这个问题,但是在运行foreach 之后,也许有更好的方法。

我该怎么做?

【问题讨论】:

  • 因为filter返回一个新的数组,你可以将aUsers分配给过滤函数。 aUsers = aUsers.filter( /.../ );.
  • 具有讽刺意味的是,您的示例有效 - 巧合。或许您可以修改示例以删除两个相邻的元素,例如尝试检查if(user.name=="cell" || user.name=="vegeta"),然后您将实际说明问题。

标签: javascript


【解决方案1】:

是的,您应该使用filter 而不是forEach

let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]

const newUsers = aUsers.filter(user => user.name !== "cell" && user.name !== "freezer");

console.log(newUsers);

如果您必须就地更改数组,则向后迭代:

let aUsers=[{"name":"goku"},{"name":"cell"},{"name":"vegeta"},{"name":"freezer"}]

for (let i = aUsers.length - 1; i >= 0; i--) {
  if (['cell', 'freezer'].includes(aUsers[i].name)) {
    aUsers.splice(i, 1);
  }
}

console.log(aUsers);

【讨论】:

  • 只是好奇 :) 我可以知道为什么要向后迭代吗?
  • 如果你不这样做,那么你将在迭代它时改变数组。在迭代元素 1 时拼接出元素 1 意味着下一个索引是 2 - 使用 在 2 中的现在是 1,因此它不会被迭代。
  • 啊有道理...谢谢:)
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多