亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對于兩個數組,查找僅存在于一個數組中的項目(對稱差異)

對于兩個數組,查找僅存在于一個數組中的項目(對稱差異)

白板的微信 2023-05-19 17:09:05
我需要比較兩個數組并返回一個新數組,其中包含僅在兩個給定數組之一中找到的任何項目,但不能同時在兩個數組中找到。換句話說,返回兩個數組的對稱差。我的算法包括在第一個數組上使用 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]));這是錯誤的輸出:[ undefined, undefined, undefined, undefined ]預期輸出是:[4]
查看完整描述

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]));


查看完整回答
反對 回復 2023-05-19
?
qq_花開花謝_0

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]));


查看完整回答
反對 回復 2023-05-19
?
MMTTMM

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



查看完整回答
反對 回復 2023-05-19
?
qq_笑_17

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


查看完整回答
反對 回復 2023-05-19
  • 4 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號