簡體   English   中英

刪除數組中的每個對象

[英]Remove every object inside the array

我正在嘗試從數組中刪除所有匹配的項目,但是它始終在其中保留一個項目。

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。

小提琴

沒有使用Array#filter選項,我需要刪除對象。

問題是.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);
    }
}

這是對數組進行就地操作的另一個版本。

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));

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

注意我整理了一下代碼。

在循環中重復使用indexOf是昂貴的。 在大型陣列中執行此操作的最壞情況是必須多次循環到循環的結尾。

此版本可能使用幾乎兩倍的內存(想象一個大數組,其中只有一個要刪除的項)。 但是,它更快。

// 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM