## 关于ES6数组API的flat的想法

197 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

认识

**flat用于将嵌套的数组“拉平”,变成一维的数组,该方法返回一个新的数组,对原数组没有影响 **

[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
  • 用于将嵌套的数组“拉平”,变成一维的数组。
  • 该方法返回一个新数组,对原数据没有影响。
  • 不传参数时,默认“拉平”一层,可以传入一个整数,表示想要“拉平”的层数。
  • 传入 <=0 的整数将返回原数组,
  • Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
  • flat() 方法会移除数组中的空项

关于粗浅源码的理解

对递归的认识

递归就就像套娃一样,一层套着一层,而且这套娃还长得一样,但是套娃总是有限个的吧,所以这就是递归的结束条件。

代码的思路
````
代码的思路:
1.调用当前函数的就是传递进去的this
2.创建一个新的数组(flatArr)和变量count,count记录符合条件4时就加1,小于传递进去的参数
2.循环this
3.因为flat会排除空项,所有判断当前项是不是为空
4.判断当前项是不是数组,使用Array.isArray(),当然除了这个还有许多的判断方式,及传递进来的参数(这个是需要拉平的层数)
5.如果符合条件4,便递归下去
6.如果不符合,便压进flatArr

Array.prototype.isFlat = function (flatindex = 0) {
  //  用于将嵌套的数组“拉平”,变成一维的数组。
  //  该方法返回一个新数组,对原数据没有影响。
  //  不传参数时,默认“拉平”一层,可以传入一个整数,表示想要“拉平”的层数。
  //  传入 <=0 的整数将返回原数组,
  //  Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组,如果原数组有空位,Array.prototype.flat() 会删除空位。
  // flat() 方法会移除数组中的空项
  //  1.先判断传入的拉平层数是否小于0,2.递归遍历当前项,好像infinity会,遗留问题
  if (flatindex <= 0) return this;
  const flatarr = []; //返回新的数组
  let count = 0;
  const arr = this;
  //  使用递归

  function flatArrEvent(arr) {
    arr.forEach((item, index) => {
      // 先检查是否是选项包含数组
      if (item == "") return false;
      if (Array.isArray(item) && count < flatindex) {
        // 如果还是数组,递归一下
        count += 1; //这个变量操作需要放到前面,因为你懂得,我就不说了(递归相当于是形成一个树,然后在从下到上返回,同步代码)
        flatArrEvent(item); //同时要把count+1
      } else {
        // 如果不是
        flatarr.push(item);
      }
    });
  }
  flatArrEvent(arr);
  return flatarr;
};
let arr = [1, 2, {}, 3, [4, 5, [3, [2,[8]]], 6,]];
const newArr = arr.isFlat(3);
console.log(newArr);

````

上述结果为

image-20220402094952310

结尾

如有错误,还请多多包涵,over,啾咪