编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组。
arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
这是一个很常见考对数组方法运用是否熟练的题目,解题分四步:
1.扁平化数组
[].flat(depth) 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
其中,depth
指定要提取嵌套数组的结构深度,可以不填:[].flat()
,默认值为1,即只展开第一层数组。
arr = arr.flat(2);
console.log('arr--: ', arr);
// arr--: [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, [12, 13, [14] ], 10]
但使用 Infinity
作为参数深度,展开任意深度的嵌套数组,即为展开所有维度变成一维数组。
arr = arr.flat(Infinity);
console.log('arr--: ', arr);
// arr--: [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
1.数组去重
ES6提供了新的数据结构new Set()。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本身是一个构造函数,用来生成Set数据结构。
去重:
arr = new Set(arr.flat(Infinity));
console.log('arr--: ', arr);
// arr--: Set(14) {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10}
还可以拓展:并集、交集、差集
let a = new Set([1, 3, 2]);
let b = new Set([4, 2, 3]);
// 并集
let union = new Set([...a, ...b]);
// Set(4) {1, 3, 2, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// Set(2) {3, 2}
// (a 相对于 b )差集
let diff = new Set([...a].filter(x => !b.has(x)));
// Set(1) {1}
// (b 相对于 a )差集
let diff = new Set([...b].filter(x => !a.has(x)));
// Set(1) {4}
3.转换成数组
Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
就是把具有 length 属性或可迭代对象(如:Set 的 size 属性)的任何对象返回 Array 对象。
想要了解更多可以看这个Array.from()
arr = Array.from(new Set(arr.flat(Infinity)));
console.log('arr--: ', arr);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 10]
4.升序数组
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序
(注意:当数字是按字母顺序排列时"40"将排在"5"前面)。
arr = Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b});
console.log('arr--: ', arr);
// arr--: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]