如何使用 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 => 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 - 为什么是<=
? OP是< 4
。 @Mrchief - OP 是 I want to remove an element out of the list
所以我认为目的是修改数组(就像大多数数组方法一样)。
@RobG,OP 是 > 4
- >
的补码是 <=
。【参考方案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 而不是 List 从动态范围中删除
使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]