我正在尝试从数组中删除所有匹配的项目,但它总是留下一个项目。
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
我需要删除对象。
答案 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));