【问题标题】:How do I remove an element in a list, using forEach?如何使用 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 方法的详细信息。

标签: javascript list node.js


【解决方案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;
});

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

_.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"]

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2014-02-12
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多