笔试之 一行代码求重
对需求的深刻认知,决定了解决问题的技巧高度
问题
例如: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 协议》,转载必须注明作者和本文链接
推荐文章: