题目:
已知如下数组:
var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
实现:
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));
解析:
-
数组扁平化, 判断数组子元素是否为数组, 是的话进行递归, 否则把子元素变为数组
-
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 实现
- 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]
- 数组升序排序, 通过 sort 实现, 若 a – b > 0, 返回 true,a 与 b 更换位置
- 最后结果为
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]