📌  相关文章
📜  如何在 JavaScript 中获得两个数组之间的对称差异?(1)

📅  最后修改于: 2023-12-03 15:08:39.532000             🧑  作者: Mango

如何在 JavaScript 中获得两个数组之间的对称差异?

在 JavaScript 中,可以使用一些方法来获取两个数组之间的对称差异。对称差异是指两个数组中独有的元素的集合。也就是说,如果两个数组A和B,A中有的元素而B没有的元素,以及B中有的元素而A没有的元素组成的集合就是它们的对称差异。

1. 使用filter()和includes()

使用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()方法将两个数组合并,即可得到两个数组之间的对称差异。

2. 使用reduce()和Set()

使用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的元素即可得到对称差异。

以上两种方法都可以有效地获取两个数组之间的对称差异,可以按照具体场景选择合适的方法。