一起养成写作习惯!这是我参与「掘金日新计划 · 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);
````
上述结果为
结尾
如有错误,还请多多包涵,over,啾咪