题目:数组
已知以下数组:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终获得一个升序且不重复的数组
实现:this
var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; //数组扁平化 Array.prototype.flat = function() { return [].concat(...this.map(item => (Array.isArray(item) ? item.flat() : [item]))); } //去重 Array.prototype.unique = function() { return [...new Set(this)] } //排序 const sort = (a, b) => a - b; console.log(arr.flat().unique().sort(sort));
解析:prototype
数组扁平化,判断数组子元素是否为数组,是的话进行递归,不然把子元素变为数组code
this.map(item => (Array.isArray(item) ? item.flat() : [item]))的执行结果为排序
[[[1], [2], [2]], [[3], [4], [5], [5]], [[6], [7], [8], [9], [[11], [12], [[12], [13], [[14]]]]], [10]]
[].concat(...this.map(item => (Array.isArray(item) ? item.flat() : [item])))的执行结果为递归
- [].concat([1], [2], [2]) -> [1, 2, 2]
- [].concat([3], [4], [5], [5]) -> [3, 4, 5, 5]
- [].concat([].concat([6], [7], [8], [9], [].concat([11], [12], [].concat([12], [13], [].concat([14]))))) -> [6, 7, 8, 9, 11, 12, 12, 13, 14]
- [].concat([10]) -> [10]
- [].concat([1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, 11, 12, 12, 13, 14], [10]) -> [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
数组去重, 经过Set实现it
- new Set(this) -> {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 10}
- [...new Set(this)] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 10]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]