数组去重我们一般大脑最先想到的就是遍历操作,es6可以通过Set进行去重,但是new Set的原型是Set,不是Array,必然需要进行转换;转换的方式很多,比如:
1、Array.from()
2、拓展运算符…
针对多维数组我们转成一位数组并去重,es6的Array.prototype.flat,其实际原理使用了递归操作。创建一个新数组,其中所有子数组元素都以递归方式连接到该数组中,直到达到指定的深度。
// 手写一个
function flatten (arr) {
const flattend = []
arr.forEach(v => {
if (Array.isArray(v))
flattend.push(...flatten(v))
else flattend.push(v)
})
return flattend
}
// example
const arr = [1, [2, 3], [2], [1, [2]]]
console.log(flatten(arr))
// [1, 2, 3, 2, 1, 2]
console.log([...new Set(flatten(arr))])
// [1, 2, 3]
console.log([...new Set(arr.flat())])
// [1, 2, 3, [2]]
console.log([...new Set(arr.flat(Infinity))])
// [1, 2, 3]
// 迭代
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}
面试题目:已知如下数组:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
// es6写法
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
[...new Set(arr.flat(Infinity).sort((a, b) => a-b))]
// es5
Array.prototype.flat = function () {
return [].concat(...this.map(v => (v instanceof Array) ? v.flat(v) : [v]))
}
Array.prototype.set = function() {
const stack = []
this.forEach(v => stack.indexOf(v) < 0 && stack.push(v))
return stack
}
arr.flat().set().sort((a, b) => a - b)