【问题标题】:How to remove multiple specific elements from an Array using a loop in JavaScript? [duplicate]如何使用 JavaScript 中的循环从数组中删除多个特定元素? [复制]
【发布时间】:2021-08-09 09:40:15
【问题描述】:

这是一个 DOM 元素数组,我想删除所有具有特定类的元素,在本例中为“已检查项”。我也想改变原始数组,所以我认为过滤方法是不可能的。

taskArr = [some DOM Elements]
taskArr.forEach(function (task) {
 if (task.children[1].className.includes("checked-Item")) {
   taskArr.splice(taskArr.indexOf(task), 1);    
}
});

【问题讨论】:

  • 为什么要对原始数组进行变异?
  • 您的代码看起来应该可以工作。什么不起作用?
  • 它删除了一些元素,但不是全部。我不知道为什么@zhokya
  • @Usman-FE 你能提供一个minimal reproducible example吗? It seems to work fine for me.
  • @Ivar 将类添加到连续元素中,但它不起作用。 splice 将打破 for 循环。

标签: javascript arrays foreach


【解决方案1】:

您的错误可能是因为您在循环内拼接元素,因此如果您控制台记录任务,并非每个都会在输出中。 我找到了一个没有 foreach 的解决方案:

taskArr = [some DOM Elements]
const length = taskArr.length;
var deleted = 0;
for(var i = 0; i < length; i ++){
     if(taskArr[i - deleted].children[1].className.includes("checked-Item")){
         taskArr.splice(i - deleted, 1);
          deleted ++;
     }
}

【讨论】:

【解决方案2】:

当列表在迭代时发生变异时,可能会产生副作用。拼接会导致后面的项目被跳过。这就是像 filter 这样的不可变函数更容易推理的原因之一。

【讨论】:

  • 有什么方法可以使用filter 方法改变原始数组吗?
  • @Usman-FE 将结果分配回原始数组?
  • 一般在filter之后我会使用map来修改匹配的项目。
  • 我应该补充一点,如果在处理后不需要过滤项目的子集,则可以在 filter 后面加上 forEach
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2022-11-03
  • 2018-08-13
  • 2021-02-27
  • 2021-04-20
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多