[英]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.