Javascript 移除阵列中的每个对象
我试图从一个数组中删除所有匹配的项,但它总是在数组中保留一项Javascript 移除阵列中的每个对象,javascript,Javascript,我试图从一个数组中删除所有匹配的项,但它总是在数组中保留一项 var item1 = {item: "item1"}, array = [{ item: "item1"},{ item: "item_non"},{ item: "item1"},{ item: "item_non"},{ item: "item1"},{ item: "item1"},{ item: "item
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
无法执行此操作,因此您必须使用for
循环:
for (var i = array.length - 1; i >= 0; i--) {
item = array[i];
if (item1.item == item.item) {
array.splice(i, 1);
}
}
这是我的版本
注意,我稍微整理了一下代码
在循环中重复使用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));
下面是另一个对数组进行就地操作的版本
//删除匹配项并返回数组
var filterArray=函数(arr,obj){
对于(变量i=0,len=arr.length;i
通过.forEach()迭代时修改数组是基本问题。正确的方法是使用.filter()
或使用简单的for
循环。如果您认为无法使用.filter()
,则应解释原因。删除项目时,您会更改以下索引。你可以通过向后迭代来修复它。相关:你的filterary
函数相当于Array.prototype.filter
,他说这对他不起作用。他说他不能使用Array.filter。他没有说不能使用多边形填充之类的函数,他说“我需要删除对象”。我认为这意味着他需要保持相同的数组,而不是像过滤器
那样创建一个新的数组。我希望问这个问题的人意识到这是他所问问题的正确答案。你将I
初始化为0
,然后执行I--
。所以它会尝试测试arr[-1]
,这是不存在的。哦,我明白了。你在循环中递减i
,然后for()
将其递增。是的,但你的答案是更简洁的方法。向上投票
// 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));