笔试之 一行代码求重

对需求的深刻认知,决定了解决问题的技巧高度

问题

例如: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 ]
本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商