如何使用 forEach 删除列表中的元素?

Posted

技术标签:

【中文标题】如何使用 forEach 删除列表中的元素?【英文标题】:How do I remove an element in a list, using forEach? 【发布时间】:2011-10-20 11:36:51 【问题描述】:
var people = ['alex','jason','matt'];

people.forEach(function(p)
    if(p.length > 4)
       //REMOVE THIS PERSON or pop it out of the list or whatever
    
);

console.log(people) //should return ['alex','matt']

我想使用这个 forEach 循环从列表中删除一个元素。

【问题讨论】:

我不相信你应该在循环遍历列表时修改它。 你试过什么? SO(基本上)是针对问题的;这不是教室。 我支持 Rafe 和 Tomalak 的 cmets。扩展 Rafe 所说的内容:在 for 每个循环中删除元素是不正常的做法(尽管我不确定 javascript 如何处理它;也许它会起作用)。您(几乎可以肯定)使用标准的基于索引的 for 循环会更好;我建议从最后一个元素向后循环,以便您可以删除元素而无需调整索引变量。查看MDN Array doco 了解有关 Array 方法的详细信息。 【参考方案1】:

为正确的工作使用正确的工具。在这种情况下:

for (var i = 0; i < data.length; i++) 
    if (data[i].value === 5) 
        data.splice(i--, 1);
    

或者正如@nnnnnn 所建议的那样,向后循环:

for (var i = data.length-1; i >= 0; i--) 
    if (data[i].value === 5) 
        data.splice(i, 1);
    

但是,您应该考虑使用Array.prototype.filter()

data = data.filter(function (e) 
    return e.value !== 5;
);

或一个实用函数库,例如lodash 或underscore,它们提供了从数组中删除元素的函数:

_.remove(data, function (e) 
    return e.value === 5;
);

后两者的好处是您的代码变得更具可读性。

【讨论】:

这是一个巧妙的解决方案,考虑了不断变化的问题! .filter 看起来真不错 @Gajus FYI .filter() 不修改数组,它返回一个新数组。我进行了编辑以反映这一点。您可能还想使用更短的 ES6 语法进行更新 - data = data.filter(e =&gt; e.value !== 5);【参考方案2】:

不应该修改你正在循环的数组。不过,您可以制作一个新的:

var newPeople = [];
people.forEach(function(p)
    if(p.length <= 4)
        newPeople.push(p);
    
);

Why you shouldn't modify array you're looping.

【讨论】:

你可以在提供给forEach的回调函数中修改数组,ES5中没有什么说不能的。 @Hans Engel - 为什么是&lt;=? OP是&lt; 4。 @Mrchief - OP 是 I want to remove an element out of the list 所以我认为目的是修改数组(就像大多数数组方法一样)。 @RobG,OP 是 &gt; 4 - &gt; 的补码是 &lt;=【参考方案3】:

ForEach,因为 ES5 可以和索引一起使用:

data.forEach(function (element, index) 
  if (element % 2 == 0) 
    data.splice(index, 1);
  
);

【讨论】:

请注意,这段代码 sn -p 实际上不起作用 -- 如果数据是 [1,28,35,444,555,666,333,424,313,303,484,464,121,12,14,88,96,108,1224,777] 那么这将把它变成 [1, 35, 555, 333, 313, 303, 464, 121, 14, 96, 1224, 777] 这是真的,很容易理解为什么以及为什么 forEach 不是该任务的正确方法,正如@Gajus 解释的那样。在您的示例中,当我们删除索引为 1(值 28)的项目时,下一个要分析的元素是索引 2,它应该是值 35,但现在是值 444,因此跳过了 35。等等……【参考方案4】:

您可以使用filter() 轻松做到这一点:

var people = ['alex','jason','matt'];

var shortPeople = people.filter(function(p)
    return p.length <= 4);
);

console.log(people);
console.log(shortPeople);

【讨论】:

【参考方案5】:

改用Array.prototype.filter

const filterByLength = (arr, len) => arr.filter(s => s.length <= len);

const people = ["jon", "alex", "jason", "matt"];
console.log(filterByLength(people, 4)); // ["jon", "alex", "matt"]

【讨论】:

以上是关于如何使用 forEach 删除列表中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 forEach 循环中的数组中删除元素?

如何仅使用 ForEach 而不是 List 从动态范围中删除

迭代时如何从通用列表中删除元素?

使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]

Python 3,如果列表中包含特定的东西,如何删除部分元素3 [重复]

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?