数组flatten的几种方法

553 阅读1分钟

将多维数组扁平化,如:

let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
// 扁平化后
arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ];
  1. 数组转换成字符串再转回数组

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    arr = arr.join(',').split(',').map(Number);
    
  2. es6some 方法检测,然后用 ... 扩展运算符来扁平化

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    while(arr.some(item => Array.isArray(item))) {
       arr  = [].concat(...arr);
    }
    
  3. es2019flat 方法

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    arr = arr.flat(Infinity);
    
  4. 递归方式

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    function flatten(arr) {
      let res = [];
      for (let i = 0, len = arr.length; i < len; i++) {
        if (Array.isArray(arr[i])) {
          res.push(...flatten(arr[i]));
        } else {
          res.push(arr[i]);
        }
      }
      return res;
    }
    flatten(arr);
    
    // 函数式编程,concat返回的是一个数组,所以用concat来合并成新数组
    // 初始值为空数组,所以acc类型是数组
    const flatten1 = x => x.reduce((acc, cur) => Array.isArray(cur) ? acc.concat(flatten1(cur)) : acc.concat(cur), [])
    
  5. 队列方式

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    function flatten(arr) {
      const newArr = [...arr];
      const res = [];
      while (newArr.length) {
        const item = newArr.shift(); // 出队
        if (Array.isArray(item)) {
          newArr.unshift(...item); // 入队
        } else {
          res.push(item);
        }
      }
      return res;
    }
    flatten(arr);
    
  6. 利用 reduce...

    let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];
    const flatten = x => x.reduce((acc, cur) => Array.isArray(cur) ? acc.concat(...cur) : acc.concat(cur), []);
    flatten(arr);