首页 > 解决方案 > 对于两个数组,查找仅存在于一个数组中的项目(对称差异)

问题描述

我需要比较两个数组并返回一个新数组,其中包含仅在两个给定数组之一中找到的任何项目,但不能同时在两者中找到。换句话说,返回两个数组的对称差。我的算法包括在第一个数组上使用 map() 方法,并使用every() 将该数组的每个元素与第二个数组的元素进行比较。如果此方法返回 true,则元素将在 map 的块级别返回(最终会将其添加到返回的数组中),否则将被丢弃。我不确定为什么我的代码不起作用。这是使用我的代码的错误输出示例:

function diffArray(arr1, arr2) {
    var newArr = arr1
        .map(elem1 => {
            if (arr2.every(elem2 => elem2 != elem1)) {
                return elem1;
            }
        });
    return newArr;
}

console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));

这是错误的输出:[未定义,未定义,未定义,未定义]

预期输出为:[4]

标签: javascriptarrays

解决方案


您的方法迭代第一个数组,并且由于使用map与检查值一起使用,您得到 undefined 的每个元素arr1

如果你也拿filter另一个数组,你可以获得想要的结果。

function diffArray(arr1, arr2) {
    return [
        ...arr1.filter(elem1 => arr2.every(elem2 => elem2 != elem1)),
        ...arr2.filter(elem1 => arr1.every(elem2 => elem2 != elem1))
    ];
}

console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));

另一种方法采用两个数组的所有值组成的数组,并通过检查该值是否不包含在两个数组中来进行过滤。

function diffArray(arr1, arr2) {
    return [...arr1, ...arr2].filter(v => arr1.includes(v) !== arr2.includes(v));
}

console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));


推荐阅读