一行程式碼解決求重問題

pardon110發表於2019-12-05

對需求的深刻認知,決定了解決問題的技巧高度

問題

例如:var a=[[1,2,3,5], [2,3,4], [2,3], [2,3,6,7]];
輸出:[2,3]
例如:var a=[[0,1,2,3,5],[-1,1,4,5,6,7],[1,2,3,5,6]];
輸出:[1,5]

常規

一般人會考慮降維,去重,計數,過濾,如下所示

var a = [[1, 2, 3, 5], [2, 3, 4], [2, 3], [2, 3, 6, 7]];
// 1.降維
var arr1 = [].concat(...a)
console.log(arr1)

// 2.去重
var uniq = [...new Set(arr1)]
console.log(uniq)

// 3. 計數
var counter = arr1.reduce((acc, v) => {
    if (v in acc) {
        acc[v]++
    } else {
        acc[v] = 1
    }
    // 4.非重
    // if(acc[v] > 1 && uniq.indexOf(v) > -1){
    //     uniq.splice(uniq.indexOf(v),1)
    // } 
    return acc
}, {})
console.log(counter)

// 4.求重
var duplicate = uniq.filter(e => counter[e] > 1)
console.log(duplicate)

列印

[ 1, 2, 3, 5, 2, 3, 4, 2, 3, 2, 3, 6, 7 ]
[ 1, 2, 3, 5, 4, 6, 7 ]
{ '1': 1, '2': 4, '3': 4, '4': 1, '5': 1, '6': 1, '7': 1 }
[ 2, 3 ]

一行

迴歸需求本質,實質上是求二維陣列中各個元素(陣列)之間的交集,
因此可選擇任意一陣列,用其中每個元素通過斷言過濾其是否在每一子成員陣列中。
思路: 過濾 --> 迭代 --> 斷言

var dup = a[0].filter(item => a.every(arr =>arr.includes(item)))
console.log(dup)     // 輸出 [ 2, 3 ]

相關文章