删除对象数组中的元素

时间:2017-02-07 13:34:22

标签: javascript arrays

我需要删除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)

但它不起作用。

2 个答案:

答案 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