📅  最后修改于: 2023-12-03 15:08:39.532000             🧑  作者: Mango
在 JavaScript 中,可以使用一些方法来获取两个数组之间的对称差异。对称差异是指两个数组中独有的元素的集合。也就是说,如果两个数组A和B,A中有的元素而B没有的元素,以及B中有的元素而A没有的元素组成的集合就是它们的对称差异。
使用filter()方法可以筛选出符合条件的元素,而includes()方法可以判断一个数组是否包含某个元素。
我们可以将两个数组分别进行筛选,筛选出不在另一个数组中的元素,再将两个数组合并成一个新数组即可。
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];
const diff = arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x)));
console.log(diff); // [1, 2, 6, 7]
以上代码中,arr1.filter(x => !arr2.includes(x))
的作用是筛选出arr1中不在arr2中的元素,同理arr2.filter(x => !arr1.includes(x))
筛选出arr2中不在arr1中的元素,再使用concat()
方法将两个数组合并,即可得到两个数组之间的对称差异。
使用reduce()方法可以将一个数组中的元素累计为一个值,而Set()对象是一组独特的值的集合。我们可以将两个数组合并成一个数组,然后使用reduce()方法将数组中每个元素的出现次数记录下来,出现一次计数器加1,然后使用Set()对象将计数器为1的元素取出,即可得到对称差异。
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];
const diff = [...arr1, ...arr2].reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
const result = new Set(Object.keys(diff).filter(key => diff[key] === 1).map(Number));
console.log([...result]); // [1, 2, 6, 7]
以上代码中,[...arr1, ...arr2]
的作用是将arr1和arr2合并,生成一个新的数组。接着使用reduce()方法累计每个元素出现的次数,使用Set()对象选出出现次数为1的元素即可得到对称差异。
以上两种方法都可以有效地获取两个数组之间的对称差异,可以按照具体场景选择合适的方法。