es6 flat使用及实现

缑勇锐
2023-12-01

参考文章:面试官连环追问:数组拍平(扁平化) flat 方法实现 - 掘金

使用参考:Array.prototype.flat() - JavaScript | MDN 

用途:flat用于拍平嵌套数组,返回一个新数组,对原数组没有影响 

使用:

  • 不传入参数,默认拍平一层
  • 传入参数,拍平的层级
  • 参数<=0,返回原数组
  • 参数为Infinity,不管嵌套多少层,都转化为一维数组
  • 如果有空位,flat会跳过空位,(不是指'',null,undefined,是空位!)

实现

  1. 判断数组 
    arr instanceof Array
    // true
    arr.constructor === Array
    // true
    Object.prototype.toString.call(arr) === '[object Array]'
    // true
    Array.isArray(arr)
    // true
    

  2. 将数组展开为一层 concat 扩展运算符

简单实现

 // concat + 递归
      function flat(arr) {
        let arrResult = [];
        arr.forEach((item) => {
          if (Array.isArray(item)) {
            arrResult = arrResult.concat(flat(item)); // 递归
          } else {
            arrResult.push(item);
          }
        });
        return arrResult;
      }

数据

 const arr = [
        1,
        2,
        3,
        4,
        [1, 2, 3, [1, 2, 3, [1, 2, 3]]],
        5,
        "string",
        { name: "弹铁蛋同学" },
      ];

通过reduce实现,并添加层级

 // reduce + 递归 + num控制层级
      function flat(arr, num = 1) {
        return num > 0
          ? arr.reduce(
              (pre, cur) =>
                pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur),
              []
            )
          : arr.slice();
      }

注意reduce内部的箭头函数,不能有括号,否则会报错

 类似资料: