4 回答

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
您的方法迭代第一個(gè)數(shù)組,并且由于使用map以及對(duì)值的檢查,您得到 undefined 的每個(gè)元素arr1。
如果您filter也使用另一個(gè)數(shù)組,您可以獲得想要的結(jié)果。
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]));
另一種方法采用兩個(gè)數(shù)組的所有值組成的數(shù)組,并通過檢查該值是否不包含在兩個(gè)數(shù)組中來進(jìn)行過濾。
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貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
即使數(shù)字在兩個(gè)數(shù)組中多次出現(xiàn),該算法也能正常工作。
它使用從兩個(gè)數(shù)組的項(xiàng)目創(chuàng)建的 Map。該地圖包含該項(xiàng)目作為鍵,該值是它在第一個(gè)數(shù)組中找到的次數(shù) - 它在第二個(gè)數(shù)組中找到的次數(shù)。
創(chuàng)建 Map 后,它會(huì)轉(zhuǎn)換為 [item, count] 的數(shù)組。然后過濾數(shù)組,刪除所有計(jì)數(shù)為的項(xiàng)目0(它們?cè)趦蓚€(gè)數(shù)組中均等存在),然后我們將數(shù)組映射到項(xiàng)目數(shù)組。
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貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的函數(shù)返回第二個(gè)數(shù)組中不存在的第一個(gè)數(shù)組的元素。
.map()
它的返回是通過返回與您的輸入 ( ) 大小完全相同的數(shù)組這一事實(shí)來解釋的arr1
,但是由于所有項(xiàng)目都arr1
存在于arr2
您不輸入if(
-statement 正文中,因此undefined
被返回。
如果您的目的是返回僅存在于一個(gè)數(shù)組中的項(xiàng)目(無論它們傳入的順序如何),您可以將該Map
對(duì)象與Array.prototype.reduce()
:
將數(shù)組參數(shù)組合成普通的數(shù)組數(shù)組
使用 循環(huán)遍歷這些內(nèi)部數(shù)組
.reduce()
,構(gòu)建Map
,顯示每個(gè)項(xiàng)目在組合數(shù)組中出現(xiàn)的次數(shù)對(duì)于組合數(shù)組的每個(gè)項(xiàng)目,刪除重復(fù)項(xiàng)并增加相應(yīng)的計(jì)數(shù)器
傳播結(jié)果
Map
和.entries()
那些.filter()
找出獨(dú)特之處
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) 時(shí)間復(fù)雜度,這與您最初的嘗試和您當(dāng)前接受的答案(均具有 O(n2) 時(shí)間復(fù)雜度)相反。因此,它可能在大型陣列上執(zhí)行得更快(任意數(shù)量的陣列,作為獎(jiǎng)勵(lì))。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用 _.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
添加回答
舉報(bào)