4 回答
TA贡献1891条经验 获得超3个赞
您的方法迭代第一个数组,并且由于使用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]));
TA贡献1835条经验 获得超7个赞
即使数字在两个数组中多次出现,该算法也能正常工作。
它使用从两个数组的项目创建的 Map。该地图包含该项目作为键,该值是它在第一个数组中找到的次数 - 它在第二个数组中找到的次数。
创建 Map 后,它会转换为 [item, count] 的数组。然后过滤数组,删除所有计数为的项目0(它们在两个数组中均等存在),然后我们将数组映射到项目数组。
const getCounts = (arr, init = new Map(), inc = 1) =>
arr.reduce((acc, item) => acc.set(item, (acc.get(item) || 0) + inc), init);
function diffArray(arr1, arr2) {
// create a Map that adds 1 for all items in arr1, and substructs 1 for every item in arr2
const counts = getCounts(arr2, getCounts(arr1), -1);
// convert to an array of pairs [item, count]
return Array.from(counts)
.filter(([, v]) => v) // remove all items with count 0
.map(([k]) => k); // map to the original item
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
console.log(diffArray([1, 2, 3, 3, 5], [1, 2, 3, 4, 5]));
console.log(diffArray([5, 1, 2, 3, 5], [1, 2, 3, 4, 5, 5]));
console.log(diffArray([1, 1, 2, 2, 3, 3, 5], [1, 2, 2, 3, 4, 5]));
TA贡献1869条经验 获得超4个赞
您的函数返回第二个数组中不存在的第一个数组的元素。
.map()
它的返回是通过返回与您的输入 ( ) 大小完全相同的数组这一事实来解释的arr1
,但是由于所有项目都arr1
存在于arr2
您不输入if(
-statement 正文中,因此undefined
被返回。
如果您的目的是返回仅存在于一个数组中的项目(无论它们传入的顺序如何),您可以将该Map
对象与Array.prototype.reduce()
:
将数组参数组合成普通的数组数组
使用 循环遍历这些内部数组
.reduce()
,构建Map
,显示每个项目在组合数组中出现的次数对于组合数组的每个项目,删除重复项并增加相应的计数器
传播结果
Map
和.entries()
那些.filter()
找出独特之处
const arr1 = [1, 2, 3, 5],
arr2 = [1, 2, 3, 4, 5],
getUniques = (...arrays) =>
[...arrays
.reduce((acc, arr) => {
[...new Set(arr)]
.forEach(item =>
acc.set(item, (acc.get(item)||0)+1))
return acc
}, new Map)
.entries()]
.reduce((acc, [item, repetitions]) =>
(repetitions == 1 && acc.push(item), acc), [])
console.log(getUniques(arr1, arr2))
.as-console-wrapper {min-height:100%;}
上述方法具有 O(n) 时间复杂度,这与您最初的尝试和您当前接受的答案(均具有 O(n²) 时间复杂度)相反。因此,它可能在大型阵列上执行得更快(任意数量的阵列,作为奖励)。
TA贡献1818条经验 获得超7个赞
使用 _.difference(array, [values])
来自lodash
或者
自己的解决方案:
const diffArray = (arrayA, arrayB) => {
const output = []
const setA = new Set(arrayA);
arrayB.forEach((n) =>{
if(!setA.has(n)){
output.push(n)
}
})
const setB = new Set(arrayB);
arrayA.forEach(n =>{
if(!setB.has(n)){
output.push(n)
}
})
return output;
}
console.log(diffArray([1, 2, 3, 5, 6], [1, 2, 3, 4, 5])); //4, 6
添加回答
举报