数组扁平化方法

2020-11-25  本文已影响0人  老衲不生气

数组扁平化方法

1、Array.flat()
默认是“拉平”一层,即arr.flat(1)
参数使用 Infinity,可展开任意深度的嵌套数组

var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

区分:
flatMap()方法对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
flatMap()只能展开一层数组。

// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
 [2, 3, 4].flatMap((x) => [x, x * 2]) 
// [2, 4, 3, 6, 4, 8]

2、reduce 和 concat(展开一层)

arr.reduce((acc, val) => acc.concat(val), []);
// 或者e使用扩展运算符 ...
const flattened = arr => [].concat(...arr);

3、reduce + concat + isArray + recursivity 使用 reduce、concat 和递归展开无限多层嵌套的数组

function flatDeep(arr, d = 1) {
   return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), [])
                : arr.slice();
};

4、
forEach+isArray+push+recursivity

// forEach 遍历数组会自动跳过空元素
const eachFlat = (arr = [], depth = 1) => {
  const result = []; // 缓存递归结果
  // 开始递归
  (function flat(arr, depth) {
    // forEach 会自动去除数组空位
    arr.forEach((item) => {
      // 控制递归深度
      if (Array.isArray(item) && depth > 0) {
        // 递归数组
        flat(item, depth - 1)
      } else {
        // 缓存元素
        result.push(item)
      }
    })
  })(arr, depth)
  // 返回递归结果
  return result;
}

5、Generator

function* flatten(array) {
   for (const item of array) {
       if (Array.isArray(item)) {
           yield* flatten(item);
       } else {
           yield item;
       }
   }
}
var arr = [1, 2, [3, 4, [5, 6]]];
const flattened = [...flatten(arr)];
// [1, 2, 3, 4, 5, 6]
上一篇下一篇

猜你喜欢

热点阅读