繁体   English   中英

删除对象数组中的元素

[英]Delete element in an array of object

我需要删除对象数组中的元素,看一下我的数组:

我想删除done == true的元素,看一下我的脚本:

 var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}]; items.forEach((elem, index) => { if(items[index].done) { items.splice(index, 1); } }) console.log(items) 

但这是行不通的。

这将不起作用,因为您正在迭代和修改同一数组。 当您删除索引1处的元素时,索引2处的元素将成为索引1,但您的forEach将继续进行迭代,并且将不检查新索引1

您可以简单地使用Array.prototype.filter()

 var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}]; items = items.filter(function(elem){ return !elem.done; }); console.log(items); 

您想从数组中过滤掉事物。 最好的办法是使用过滤器方法。

 var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] console.log(items.filter(o => !o.done)) 

代码的问题是在迭代数组时要修改数组,因此,当删除一个元素时,所有元素都会移位,而跳过下一个元素。

检查以下代码段,以及如何从未访问(d)元素:

 var items = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] var itemsCopy = [{text: "a", done: false}, {text: "b", done: false}, {text: "c", done: true}, {text: "d", done: true}, {text: "e", done: true}] items.forEach((elem, index) => { if (itemsCopy[index].text !== items[index].text) console.log('you want to access', itemsCopy[index].text, 'instead you are accessing', items[index].text) if(items[index].done) { items.splice(index, 1); //elem.remove(); } }) 

每个周期索引增加1,因此,当删除c元素(索引2)时,索引将变为3。但是,由于删除了c ,因此数组如下所示:

[a, b, d, e]

因此,您正在访问元素e ,而不是d ,因为现在d索引为2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM