js数组扁平化

时间:2022-10-13 23:55:42

看到一个有趣的题目:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

一个多维数组,要求扁平化,去重且升序,你会怎么做?

我们先从第一步来吧, 实现扁平化:

方法一:

像这种多维数组, 需要循环判断, 因此用while, 不用if(if是一次判断)

flatten = (arr) => {
while(arr.some(item => Array.isArray(item))){
arr = [].concat.apply([],arr);
}
return arr;
} flatten(arr)
// [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10] 方法二:
比较hack的方式, 只适用于纯数字
arr.toString().split(',').map(itm=> parseInt(itm))
//  [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

最佳实践方法三:
  lodash 的 flatten, flattenDeep 方法。 当然, 如果是简单的二维, 那我们用es6扩展运算符或concat就可以搞定,比如:
var arr = [1, [2, 3]];
[].concat.apply([],arr); // [1, 2, 3]

[].concat(...arr) // [1, 2, 3]

第二部, 去重且升序:

这步相对于第一步来说应该很简单了,一维数组去重方式好多,

sortnum = (a, b) => {
return a - b
}
var arr1 = [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10] new Set(arr1.sort(sortnum)) // 先排序再去重