我需要删除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)
但它不起作用。
答案 0 :(得分:3)
这不起作用,因为您正在迭代并修改相同的数组。当您删除索引1处的元素时,索引2处的元素将成为索引1,但您的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);
将继续迭代,并且不会检查新索引1
您只需使用Array.prototype.filter()
即可
configure

答案 1 :(得分:2)
您想过滤掉数组中的内容。最好的方法是使用filter方法。
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