什么是数组扁平化?
数组扁平化就是将「多维数组」转化为「一维数组」。

这样的方式就是一维数组。

  1. var arr = [1, 2, 3, 4]

多维数组就是数组中包括数组。

  1. var arr = [1, 2, 3, 4, [5, 6, [7, 8]]];

而数组扁平化就是将多维数组转化为一维数组。

  1. var arr = [1, 2, 3, 4, [5, 6, [7, 8]]];
  2. // 转化为
  3. var arr = [1, 2, 3, 4, 5, 6, 7, 8];

那么看下我今天的主角🥲 ,亮个相吧小宝贝 !

  1. // 编写程序将数组扁平化并将扁平化数组后去重,最终得到一个升序且不重复的一维数组
  2. var arr = [
  3. [1, 2, 3],
  4. [3, 4, 5, 5],
  5. [6, 7, 8, 9, [11, 12, [12, 13, [14]]]],
  6. 10,
  7. ];

for 循环 + 递归

  1. // 该方法用于判断 item 是不是一个数组
  2. function _isArr(item){
  3. return {}.toString.call(item) === "[object Array]"
  4. }
  5. function flatten(arr) {
  6. var _arr = arr || [];
  7. var newArr = [];
  8. for (let i = 0; i < _arr.length; i++) {
  9. // 如果是一个数组
  10. if(_isArr(_arr[i])){
  11. // 那就进行递归,将结果合并到 _arr 中
  12. // 例如 newArr = newArr.concat(flatten([1, 2, 3]))
  13. newArr = newArr.concat(flatten(_arr[i]))
  14. }else{
  15. // 如果不是数组那就直接 push
  16. newArr.push(arr[i])
  17. }
  18. }
  19. return newArr
  20. }
  21. console.log(flatten(arr));
  22. // [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

或者来个优化版本哈哈哈

  1. Array.prototype.flatten = function () {
  2. var _arr = this;
  3. var newArr = [];
  4. var toStr = {}.toString;
  5. // 如果不是数组抛出错误
  6. if (toStr.call(_arr) !== "[object Array]") {
  7. throw new Error("只有数组才能调用flatten方法");
  8. }
  9. _arr.forEach((item) => {
  10. // 利用三目运算符判断是不是数组
  11. toStr.call(item) === "[object Array]"
  12. ? (newArr = newArr.concat(item.flatten()))
  13. : newArr.push(item);
  14. });
  15. return newArr;
  16. };
  17. console.log(arr.flatten());
  18. // [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

ES6 的 flat()

或者简单方便

  1. console.log(arr.flat()); // [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, Array(3), 10]

但是这样的方式只能扁平化二维数组,三维数组就不好使了

flat()还可以传参Infinity表示无穷的,这样就能快速的实现数组扁平化

  1. console.log(arr.flat(Infinity));
  2. // [1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

最后来个完整的答案:

  1. // arr.flat(Infinity) 实现扁平化后用 new Set() 实现去重,
  2. // new Set 返回 Set 对象 用 Array.from 转化为数组,
  3. // 最后使用 sort 来排序
  4. let res = Array.from(new Set(arr.flat(Infinity))).sort(function (a, b) {
  5. return a - b;
  6. });
  7. console.log(res);