美文网首页
数组扁平化方法

数组扁平化方法

作者: 老衲不生气 | 来源:发表于2020-11-25 11:06 被阅读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]
    

    相关文章

      网友评论

          本文标题:数组扁平化方法

          本文链接:https://www.haomeiwen.com/subject/wtogiktx.html