如果对象包含在另一个数组中,则从数组中删除它

时间:2016-10-17 09:22:09

标签: javascript ecmascript-6

我试图从数组中删除一个对象,如果该对象的属性(唯一)包含在另一个数组中。我知道我可以像这样做一个嵌套的for循环:

for(i = 0; i < array.length; i++) {
    for(j = 0; j < array2.length; j++) {
        if(array[i].Email === array2[j].Email) {
            //remove array[i] object from the array
        }
    }
}

或者其他什么。这样的事情。那有ES6过滤器吗?我可以轻松地对带有字符串的常规数组进行过滤,但是使用对象数组进行过滤会有点棘手。

6 个答案:

答案 0 :(得分:6)

如果您使用ES6很好,甚至可以查看array.findarray.filterarray.some

Array.findIndex

var result = array.filter(x=>{
  return array2.findindex(t=> t.Email === x.Email) === -1
})

Array.some

var result = array.filter(x=>{
  return !array2.some(t=> t.Email === x.Email)
})

答案 1 :(得分:2)

不是最优,但试试这个

array = array.filter( function( item ){
  return array2.filter( function( item2 ){
    return item.Email == item2.Email;
  }).length == 0;
});

尝试使用find,它不会迭代所有元素,并会在首次匹配后中断

array = array.filter( function( item ){
  return array2.find( function( item2 ){
    return item.Email == item2.Email;
  }) == undefined;
});

答案 2 :(得分:2)

您可以使用Set与ES6

var array = [/* your data */],
    array2 = [/* your data */],
    set = new Set(...array2.map(a => a.Email));

array = array.filter(a => !set.has(a.Email));

答案 3 :(得分:-1)

试试这个.... :)

if(array[i].Email === array2[j].Email){
   // splice(Index you want to remove,to witch element)
   array1.splice(i,1);
}

splice()可以删除数组的元素。你需要传递巫婆元素。巫婆元素是删除的开始。应删除多少个元素。那是1 .. :)

答案 4 :(得分:-1)

如何编写函数,传递参数并简单地收集输出?

&#13;
&#13;
function arrNotInArrKey(arr1, arr2, key) {
  for (var i = 0; i < arr1.length; i++) {
    for (var j = 0; j < arr2.length; j++) {
      if (arr1[i][key] === arr2[j][key]) {
        arr1.splice(i, 1);
        i--;
      }
    }
  }
  return arr1;
}
console.log(
  arrNotInArrKey([{
    name: 1
  }, {
    name: 3
  }, {
    name: 2
  }], [{
    name: 2
  }], "name")
);
&#13;
&#13;
&#13;

答案 5 :(得分:-1)

You can use shift function. here it's example.

http://www.w3schools.com/js/tryit.asp?filename=tryjs_array_shift
for(i = 0; i < array.length; i++) {
    for(j = 0; j < array2.length; j++) {
        if(array[i].Email === array2[j].Email) {
            array.shift(array[i].Email);
        }
    }
}