数组扁平化

有这么一个数组 var arr = [[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] =>[1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10]

方法一:

function flatAndsort(arr) {
  return arr
    .toString()
    .split(',') //拍平数组(但是有个不好的地方就是会将数字类型转换成字符串类型)
    .sort((a, b) => {
      return a - b; //升序排序
    })
    .map(item => {
      return parseInt(item); // 因为之前转换成了字符串类型我们转换回来
    });
}
//[ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法二:

function flat(arr) {
  return [].concat(
    ...arr.map(item => {
      return Array.isArray(item) == true ? flat(item) : item;
    })
  );
}
function sort(a, b) {
  return a - b;
}

let c = flat(arr); //[ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法三

function flat(arr) {
  return arr.reduce((pre, current) => {
    return pre.concat(current.constructor == Array ? flat(current) : current);
  }, []);
}
function sort(a, b) {
  return a - b;
}
let c = flat(arr); //[ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法四(完全 ES6 方法)

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

let c = arr.flat(4).sort((a, b) => {
  return a - b;
});

Array.flat()函数是将数据扁平化的一个函数,它接收一个参数,depath 决定数组嵌套的深度,这里例深度是 4 所以我们传 4

最后在增加一个需求,将扁平化升序排列的数组去重如何实现?**

ES5:

let list = c.filter((item, index, list) => {
  return list.indexOf(item) == index;
});

ES6:

[...new Set([1, 2, 2, 3, 4, 5])]; // 12345