如何在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)
或者您可以使用 filter
和 some
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)
我想找出两个数组之间的区别。我尝试了以下来自 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)
或者您可以使用 filter
和 some
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)