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

时间:2015-02-13 06:14:43

标签: javascript jquery arrays

我有一个像这样的数组

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

我有另一个像这样的数组

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

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

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 +的解决方案

3 个答案:

答案 0 :(得分:3)

使用.filter.indexOf

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

Example

jQuery版

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

<强>更新

  

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

这是因为

  

删除数组元素时,数组长度不受影响。    Deleting array elements

答案 1 :(得分:0)

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

如果删除数组元素时数组,则不会影响数组长度。即使您删除数组的最后一个元素并且该元素在数组中不可用,这也成立。

消息来源:CLICK HERE

要从数组中删除元素,请使用以下

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

答案 2 :(得分:0)

我发现在就地更新数组时经常使用的模式是读写:

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

即。保持编写器指针wp从0开始,并对要保留的每个元素执行元素复制arr[wp++]=arr[rp]操作。最后,您可以调整阵列的大小。

但是使用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的简单分配是可以接受的,但请注意,您不是&#34;更新&#34;在这种情况下,数组,但为同一个变量分配一个新数组。

如果在其他地方引用相同的对象,则会有所不同。