删除数组中的每个对象

时间:2015-10-21 23:02:15

标签: javascript

我正在尝试从数组中删除所有匹配的项目,但它总是留下一个项目。

var item1 = {item: "item1"},
    array = [{
        item: "item1"},{
        item: "item_non"},{
        item: "item1"},{
        item: "item_non"},{
        item: "item1"},{
        item: "item1"},{
        item: "item1"},{
        item: "item_non"},{
        item: "item_non"
    }];
array.forEach(function(items){
    if(item1.item === items.item){
        var index = array.indexOf(items);
        if(index !== -1){
            array.splice(index,1);
        }
    }
});

我也搞砸了,它只删除了匹配的4/5项而不是5/5。

Fiddle

没有选项可以使用Array#filter我需要删除对象。

3 个答案:

答案 0 :(得分:6)

问题是.splice()移动了被删除元素之后的所有元素。因此,如果删除元素3,则元素4变为3,5,变为4,依此类推。循环的下一次迭代将处理元素4,但这是原始元素5 - 跳过原始元素4.

解决此问题的方法是反向处理数组。 .forEach无法执行此操作,AFAIK,因此您必须使用for循环:

for (var i = array.length - 1; i >= 0; i--) {
    item = array[i];
    if (item1.item == item.item) {
        array.splice(i, 1);
    }
}

答案 1 :(得分:0)

这是另一个对数组进行就地操作的版本。

http://codepen.io/anon/pen/XmZrww?editors=001

// remove the matching item and return the array
var filterArray = function (arr, obj) {
  for (var i = 0, len = arr.length; i < len; i++) {
    if (arr[i].item === obj.item) {
      arr.splice(i, 1);
      len--;
      i--;
    }
  }
  return arr;
};

var item1 = {item: "item1"};
var data = [
  {item: "item1"},
  {item: "item_non"},
  {item: "item1"},
  {item: "item_non"},
  {item: "item1"},
  {item: "item1"},
  {item: "item1"},
  {item: "item_non"},
  {item: "item_non"}
];

console.log(filterArray(data, item1));

答案 2 :(得分:-1)

这是我的http://codepen.io/anon/pen/VvQZVe?editors=001

版本

注意我稍微清理了一下代码。

在循环中反复使用indexOf是很昂贵的。在大阵列中执行此操作的最坏情况是必须多次进入循环的末尾。

这个版本可能会占用几乎2倍的内存(想象一下只有一个项目需要删除的大数组)。但是,它更快。

// indexOf is expensive, especially in a loop.
// here we just iterate straight through the array and append
// mismatching properties to another array that gets returned.
var filterArray = function (arr, obj) {
  var returnArray = [];

  arr.forEach(function (el) {
    if (el.item !== obj.item) {
      returnArray.push(el);
    }
  });

  return returnArray;
};

var item1 = {item: "item1"};
var data = [
  {item: "item1"},
  {item: "item_non"},
  {item: "item1"},
  {item: "item_non"},
  {item: "item1"},
  {item: "item1"},
  {item: "item1"},
  {item: "item_non"},
  {item: "item_non"}
];

console.log(filterArray(data, item1));