js数组扁平化

看到一个有趣的题目:

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))   // 先排序再去重

 

posted @ 2019-03-01 12:33  doublealoe  阅读(589)  评论(0编辑  收藏  举报