将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

158 阅读2分钟

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组。
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]