删除基于另一个数组的数组元素

Delete elements of array based on another array

本文关键字:数组元素 数组 另一个 删除      更新时间:2023-11-04

我有一个类似的数组

var arrayFilterKeyValues=[{id:1,name:"one"},{id:2,name:"2"}..]

我有另一个类似的阵列

var valuesArr=["1","2","3","4"...]

现在,如果id在valuesArr中,我将尝试从arrayFilterKeyValues中删除元素。这是我正在使用的代码

for (var i = 0; i < arrayFilterKeyValues.length; ++i) {
    var found = false;
    for (var k = 0; k < valuesArr.length; k++) {
        if (arrayFilterKeyValues[i].id == valuesArr[k]) {
            found = true;
            break;
        }
    }
    if (found) {
        delete arrayFilterKeyValues[i];
    }
}

这是在删除元素,但当我检查数组时,它在数组中有逗号(,),当我检查长度时,它仍然显示删除元素之前的数组长度。我在这里做错了什么?需要与IE8+兼容的解决方案

使用.filter和.indexOf

arrayFilterKeyValues = arrayFilterKeyValues.filter(function (el) {
  return valuesArr.indexOf(el.id) === -1;
});

示例

jQuery版本

arrayFilterKeyValues = $.grep(arrayFilterKeyValues, function (el) {
  return $.inArray(el.id, valuesArr) === -1;
});

更新

当我检查数组时,它有逗号(,)

发生这种情况是因为

删除数组元素时,数组长度不受影响。删除阵列元素

delete运算符从对象中删除属性。

如果是数组,删除数组元素时,数组长度不受影响。即使删除了数组的最后一个元素,并且该元素在数组中不可用,这种情况也会发生。

来源:点击这里

要从阵列中删除元素,请使用以下

for (var i = 0; i < arrayFilterKeyValues.length; ++i) {
  var found = false;
  for (var k = 0; k < valuesArr.length; k++) {
      if (arrayFilterKeyValues[i].id == valuesArr[k]) {
          found = true;
          break;
      }
  }
  if (found) {
   var removedele = arrayFilterKeyValues.splice(i, 1);
  }
}

我发现在更新阵列时经常有用的模式是读写模式:

var wp = 0, n=arrayFilterKeyValues.length;
for (var rp=0; rp<n; rp++) {
    if (valuesArr.indexOf(arrayFilterKeyValues[rp].id) == -1) {
        arrayFilterKeyValues[wp++] = arrayFilterKeyValues[rp];
    }
}
arrayFilterKeyValues.splice(wp);

即保持写入器指针CCD_ 5从0开始并对要保持的每个元素执行元素复制CCD_。最后,您可以调整阵列的大小。

然而,使用Javascript,数组的filter方法已经完成了这种操作,唯一的问题是返回一个新的独立数组。可能通过不分配新元素而获得的效率不值得额外编码。还有更简单的

var new_arr = arrayFilterKeyValues.filter(function(x) {
                  return valuesArr.indexOf(x.id) == -1;
              });
arrayFilterKeyValues.splice(0);
arrayFilterKeyValues.push.apply(arrayFilterKeyValues, new_arr);

尽管进行了额外的内存分配,但可能会更高效。

代替splice/push操作,可以对arrayFilterKeyValues进行简单赋值。这是可以接受的,但请注意,在这种情况下,您不是在"更新"数组,而是将新数组分配给同一变量。

如果同一个对象在其他地方被引用,则情况会有所不同。