手写 flat|刷题打卡

1,330 阅读3分钟

手写 flat

create by db on 2020-9-2 13:30:46
Recently revised in 2023-2-24 12:26:15

闲时要有吃紧的心思,忙时要有悠闲的趣味

目录

前言

返回目录

 如题。

正文

flat

返回目录

详情请参考:Array.prototype.flat() | MDN

 flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

 也就是说,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维数组。

 该方法返回一个新数组,会移除数组中的空项,对原数据没有影响。

语法:

var newArray = arr.flat([depth])

参数:

  • :depth 可选;指定要提取嵌套数组的结构深度,默认值为 1。

返回值:

 一个包含将数组与子数组中所有元素的新数组。

使用:

var arr1 = [1, 2, [3, 4]]
arr1.flat()
// [1, 2, 3, 4]

var arr2 = [1, 2, [, 4, [5, 6]]]
arr2.flat()
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2)
// [1, 2, 3, 4, 5, 6]

//使用 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]

//存在多个数组及空值的数组
var arr6 = [
    1,
    ,
    [3, , [5, , [7, , [9, 10], 11], 12], 13],
    14,
    15,
    [16, 17, [18, 19, [20, 21, [22, 23], 24], 25], 26],
    27,
    28,
  ];
arr6.flat(Infinity)
[1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]

实现 myFlat

返回目录

代码实现:

递归实现

 Array.prototype.myFlat1 = function (dep = 1) {
  // 声明一个新数组
  let result = [];
  // 遍历原数组
  this.forEach((item, index) => {
    // 当原数组内存在数组
    if (Array.isArray(item) && dep) {
      // 并且层级dep大于1时递归
      if (dep > 1) {
        // 使用concat链接数组
        result = result.concat(item.myFlat1(dep - 1));
      } else {
        result = result.concat(item.filter(item => item));
      }
    } else {
      result.push(item);
    }
  });
  return result;
};

简洁版:

// 重写数组flat方法
// 1.会去掉数组的空项
// 2.返回新数组

Array.prototype.myFlat2 = function (dep = 1) {
  return this.reduce((acc, val) => {
    return acc.concat(
      Array.isArray(val) && dep > 0
        ? // 这里的三目就是防止这个现象:[3].concat([4]) // 结果为[3, 4]
          val.myFlat2(dep - 1)
        : Array.isArray(val)
        ? [val]
        : val
    );
  }, []);
};

循环实现

  Array.prototype.myFlat3 = function (dep = 1) {
    // 声明一个新数组
    let result = this;
    // // 当原数组内存在数组并且层级dep大于时循环
    while (result.some(Array.isArray) && dep > 0) {
      // 连接数组,并去除空值
      result = [].concat(...result.filter(item => item));
      dep--;
    }
    return result.filter(item => item);
  };

验证

  for (let dep = 0; dep < 5; dep++) {
    console.log("=============================");
    console.log("系统flat=========", arr6.flat(dep));
    console.log("我的arr6==myFlat1", arr6.myFlat1(dep));
    console.log("我的arr6==myFlat2", arr6.myFlat2(dep));
    console.log("我的arr6==myFlat3", arr6.myFlat3(dep));
  }
//   =============================
// flat.html:114 原生flat=== (7) [1, Array(4), 14, 15, Array(4), 27, 28]
// flat.html:115 myFlat1==== (7) [1, Array(4), 14, 15, Array(4), 27, 28]
// flat.html:116 myFlat2==== (7) [1, Array(4), 14, 15, Array(4), 27, 28]
// flat.html:117 myFlat3==== (7) [1, Array(4), 14, 15, Array(4), 27, 28]
// flat.html:113 =============================
// flat.html:114 原生flat=== (12) [1, 3, Array(4), 13, 14, 15, 16, 17, Array(4), 26, 27, 28]
// flat.html:115 myFlat1==== (12) [1, 3, Array(4), 13, 14, 15, 16, 17, Array(4), 26, 27, 28]
// flat.html:116 myFlat2==== (12) [1, 3, Array(4), 13, 14, 15, 16, 17, Array(4), 26, 27, 28]
// flat.html:117 myFlat3==== (12) [1, 3, Array(4), 13, 14, 15, 16, 17, Array(4), 26, 27, 28]
// flat.html:113 =============================
// flat.html:114 原生flat=== (17) [1, 3, 5, Array(4), 12, 13, 14, 15, 16, 17, 18, 19, Array(4), 25, 26, 27, 28]
// flat.html:115 myFlat1==== (17) [1, 3, 5, Array(4), 12, 13, 14, 15, 16, 17, 18, 19, Array(4), 25, 26, 27, 28]
// flat.html:116 myFlat2==== (17) [1, 3, 5, Array(4), 12, 13, 14, 15, 16, 17, 18, 19, Array(4), 25, 26, 27, 28]
// flat.html:117 myFlat3==== (17) [1, 3, 5, Array(4), 12, 13, 14, 15, 16, 17, 18, 19, Array(4), 25, 26, 27, 28]
// flat.html:113 =============================
// flat.html:114 原生flat=== (22) [1, 3, 5, 7, Array(2), 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, Array(2), 24, 25, 26, 27, 28]
// flat.html:115 myFlat1==== (22) [1, 3, 5, 7, Array(2), 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, Array(2), 24, 25, 26, 27, 28]
// flat.html:116 myFlat2==== (22) [1, 3, 5, 7, Array(2), 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, Array(2), 24, 25, 26, 27, 28]
// flat.html:117 myFlat3==== (22) [1, 3, 5, 7, Array(2), 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, Array(2), 24, 25, 26, 27, 28]
// flat.html:113 =============================
// flat.html:114 原生flat=== (24) [1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
// flat.html:115 myFlat1==== (24) [1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
// flat.html:116 myFlat2==== (24) [1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
// flat.html:117 myFlat3==== (24) [1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]

总结

返回目录

 路漫漫其修远兮,与诸君共勉。

参考文档

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议


db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。