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