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