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(n2) 時間復雜度)相反。因此,它可能在大型陣列上執行得更快(任意數量的陣列,作為獎勵)。

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
添加回答
舉報