如何在JS中找到两个相同数组之间的差异?

How to find difference between two same array in JS?

我想找出两个数组之间的区别。我尝试了以下来自 SF 社区给出的解决方案之一的代码,但我没有用。

如果数字重复偶数次(例如 "7" 在两个数组 a 和 b[ 中重复两次,我的下面的代码将不起作用=55=] 结果我得到 "7" 作为差异),

而代码适用于重复 ODD NUMBER 次的数字(例如 "11" 在两个数组中重复三次 a & b结果它取消了所有 "11" 和 return。

我想要解决方案找出差异或取消重复任意次数的数字,我的意思是如果像“7”这样的数字在两个数组中重复两次那么它应该同时取消数字和 return NOTHING .

并且给定两个数组,您可以在下面的给定数组中找到更多示例,例如“7”和“11”

a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13 ", "81"]

b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17 ", "3", "7", "1", "11", "9 ", "8", "17", "49", "30", "81", "11", "11", "7"]

下面是我用来查找两个数组之间差异的代码,

function arr_diff (a1, a2) {

var a = [], diff = [];

for (var i = 0; i < a1.length; i++) {
    a[a1[i]] = true;
}

for (var i = 0; i < a2.length; i++) {
    if (a[a2[i]]) {
        delete a[a2[i]];
    } else {
        a[a2[i]] = true;
    }
}

for (var k in a) {
    diff.push(k);
}

console.log(diff);
return diff;
}

DIFFERENCE/RESULT :我从两个数组中得到的是:["7", "8", "9", "78", "81", " getUnique"]

预期结果:来自我想要的两个数组:["9", "78"]

请帮忙,我们将不胜感激。

a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]
b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"]
let difference = a
                 .filter(x => !b.includes(x))
                 .concat(b.filter(x => !a.includes(x)));

console.log(difference);

这将解决您的问题

const difference = a
                 .filter(x => !b.includes(x))
                 .concat(b.filter(x => !a.includes(x)));

在你的代码中发生了什么,

第一次检查 7,然后从 a 中删除。现在当它下次检查相同时,因为它已从 a 中删除,它会在 a 中设置 true。其他连续数字也一样。

你应该这样做

var a1 = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]

var a2  = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"]

function arr_diff (a1, a2) {

var a = {}, diff = [], newArr = [];

for (var i = 0; i < a1.length; i++) {
    a[a1[i]] = true;
}

for (var i = 0; i < a2.length; i++) {
    if (a[a2[i]]) {
//         delete a[a2[i]];
    } else {
        newArr[a2[i]] = true;
    }
}

for (var k in newArr) {
    diff.push(k);
}

console.log(diff);
return diff;
}

arr_diff(a1, a2)

我所做的是,我正在创建一个新数组 (newArr),它将仅存储唯一数字

为了使您的代码正常工作,您可以使用 Set 先删除重复值

a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]

b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"]

 var set1=new Set([...a]) // remove duplicates from each array
 var set2=new Set([...b])
 a1=[...set1]
 a2=[...set2]

function arr_diff (a1, a2) {

  var a = [], diff = [];
  
  for (var i = 0; i < a1.length; i++) {
      a[a1[i]] = true;
  }
  
  for (var i = 0; i < a2.length; i++) {
      if (a[a2[i]]) {
          delete a[a2[i]];
      } else {
          a[a2[i]] = true;
      }
  }
  
  for (var k in a) {
      diff.push(k);
  }
  
  console.log(diff);
  return diff;
  }

  arr_diff (a1, a2)

或者您可以使用 filtersome

a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]

b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"]

res=b.filter(n=>!a.some(u=>n==u))
console.log(res)

试试这个,告诉我它是否适合你

let a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]

let b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"];

function arr_diff(a1,a2){
    let a = [...a1];
    let b = [...a2];

    let c = [];
    for(let i=0; i < b.length; i++){
        if(a.includes(b[i])) {b.splice(i, 1);}
        else c.push(b[i]);
    }

console.log(c);
return c;
}

arr_diff(a,b)

如果你也想在差异数组中保留额外的值,例如。对于

a = [1,1,1,1]
b = [1]

结果:[1,1,1],我会这样做:计算第一个数组中出现的次数,然后从第二个数组中减去该次数。

function getDifference(array1, array2) {
  const counter = {}
  const result = []

  function addNumberToCounter(number) {
    const currentCount = counter[number] || 0
    counter[number] = currentCount + 1
  }
  function subtractNumberFromCounter(number) {
    const currentCount = counter[number] || 0
    counter[number] = currentCount - 1
  }
  function addNumberToResult(number, times) {
    for(let i = 0; i < times; i++) {
      result.push(number)
    }
  }
  
  array1.forEach(addNumberToCounter)
  array2.forEach(subtractNumberFromCounter)
  
  for (let number in counter) {
    const numberCount = Math.abs(counter[number])
    addNumberToResult(number, numberCount)
  }
  
  return result
}

const a = ["1", "3", "17", "12", "11", "17", "7", "7", "85", "16", "5", "30", "11", "81", "20", "49", "8", "17", "11", "8", "13", "81"]
const b = ["5", "20", "78", "13", "85", "81", "12", "17", "16", "8", "17", "3", "7", "1", "11", "9", "8", "17", "49", "30", "81", "11", "11", "7"]
const result = getDifference(a, b)
console.log(result)