比较两个 Javascript 数组并删除重复项

IT技术 javascript
2021-02-06 05:38:46

如果它具有另一个数组的元素,是否还有其他更好的方法可以从一个数组中删除重复项?

<script>
var array1 = new Array("a","b","c","d","e","f");
var array2 = new Array("c","e");

for (var i = 0; i<array2.length; i++) {
    var arrlen = array1.length;
    for (var j = 0; j<arrlen; j++) {
        if (array2[i] == array1[j]) {
            array1 = array1.slice(0, j).concat(array1.slice(j+1, arrlen));
        }
    }
}
alert(array1);

</script>
6个回答
array1 = array1.filter(function(val) {
  return array2.indexOf(val) == -1;
});

或者,随着 ES6 的出现:

array1 = array1.filter(val => !array2.includes(val));

filter() 参考这里

indexOf() 参考这里

包括()参考这里

对于唯一值列表来说效果很好,但是对于其中包含重复项的列表,例如将“赎金票据”与杂志中的单词列表进行比较(假设大小写必须匹配并且每个单词的数量必须正确)。 .
2021-03-13 05:38:46
作为上述代码的旁注和解释:“indexOf:返回等于指定值的数组中元素的第一个(最小)索引,如果没有找到,则返回 -1。” developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-19 05:38:46
很棒的一段代码,但请注意,如果您有嵌套数组,它就不起作用。
2021-03-20 05:38:46
带有过滤器的漂亮灵魂。
2021-04-08 05:38:46
我喜欢它,但它绝对需要解释,或者至少需要一个链接,将某人引导到解释它的正确位置。
2021-04-11 05:38:46

出于我无法理解的原因,诀窍是将外循环向下 (i--) 和内循环向上 (j++)。

请参阅下面的示例:

function test() {
  var array1 = new Array("a","b","c","d","e","f");
  var array2 = new Array("c","e");
  for (var i = array1.length - 1; i >= 0; i--) {
    for (var j = 0; j < array2.length; j++) {
      if (array1[i] === array2[j]) {
        array1.splice(i, 1);
        }
      }
    }
    console.log(array1)
  }

我怎么知道这个?请参阅以下内容:

for( var i =myArray.length - 1; i>=0; i--){
  for( var j=0; j<toRemove.length; j++){
    if(myArray[i] === toRemove[j]){
      myArray.splice(i, 1);
    }
  }
}

或者

var myArray = [
  {name: 'deepak', place: 'bangalore'}, 
  {name: 'chirag', place: 'bangalore'}, 
  {name: 'alok', place: 'berhampur'}, 
  {name: 'chandan', place: 'mumbai'}
];
var toRemove = [
  {name: 'deepak', place: 'bangalore'},
  {name: 'alok', place: 'berhampur'}
];

for( var i=myArray.length - 1; i>=0; i--){
    for( var j=0; j<toRemove.length; j++){
        if(myArray[i] && (myArray[i].name === toRemove[j].name)){
            myArray.splice(i, 1);
        }
    }
}

alert(JSON.stringify(myArray));

关于这一点,有人能解释为什么外循环需要向下循环 (--)?

祝你好运!

如何在不使用属性 name.like 而不指定任何数组 obj name 的情况下删除重复项。
2021-03-24 05:38:46
您是否有理由不使用数组文字、过滤器或包含?
2021-04-02 05:38:46
@vishal 更改 array1[i] === array2[j] 以扩展项目的属性名称。这使得它现在array1[i].propertyOfThisItem === array2[j].possiblyTheSameProperty
2021-04-10 05:38:46

利用 Array.splice()

var array1 = ['1', '2', '3', '4', '5'];
var array2 = ['4', '5'];
var index;
for (var i=0; i<array2.length; i++) {
    index = array1.indexOf(array2[i]);
    if (index > -1) {
        array1.splice(index, 1);
    }
}

使用 Set.prototype 构造函数:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

let array1 = Array('a', 'b', 'c', 'd', 'e', 'f')
let array2 = Array('c', 'e', 'g')
let concat = array1.concat(array2) // join arrays => [ 'a', 'b', 'c', 'd', 'e', 'f', 'c', 'e', 'g' ]

// Set will filter out duplicates automatically
let set = new Set(concat) // => Set { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }

// Use spread operator to extend Set to an Array
let result = [...set]
console.log(result) // =>  [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]
@Drenai 是的,如果您进行字符串化,它适用于对象:)
2021-03-16 05:38:46
这是极好的。使用Set和 MDN 链接中的示例函数可以实现非常巧妙的联合(它回答了问题)、差异和交集👍我猜如果你先对它们进行字符串化,它会适用于对象(否则使用 ===)
2021-03-25 05:38:46

这是我的解决方案

array1 = array1.filter(function(val) { return array2.indexOf(val.toString()) == -1; });