ES6+ flat()
1. 前言
本节我们要学习的是 ES6 提供的 flat()
方法,对多维数组进行扁平化操作,而且可以对数组中的空项进行移除。
2. ES5 中的处理方法
function flat(arr){
if(Object.prototype.toString.call(arr) != "[object Array]"){return false};
let res = [];
for(var i=;i<arr.length;i++){
if(arr[i] instanceof Array){
res = res.concat(flat(arr[i]))
}else{
res.push(arr[i])
}
}
return res;
};
var arr = [,,[,,,[,,],],,[,]];
flat(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
上面的代码是实现了一个数组扁平化的方法,在里面我们会定义一个空数组然后递归地去调用 flat()
方法处理原数组中的每一项,如果传入的是元素是数组,则要继续递归处理,最终会得到一个一维的数组。此方法只能把任意维度的数组转化为一维数组,不能转化为指定维度的数组,如果需要的话还得继续处理。
3. 方法详情
3.1 语法使用
@H_404_256@语法使用:
var newArray = arr.flat([depth])
@H_404_256@参数解释:
3.2 语法示例
var arr = [, , [, , [, ]]];
arr.flat(); // [1, 2, 3, 4, [5, 6]]
arr.flat(); // [1, 2, 3, 4, 5, 6]
使用 Infinity,可展开任意深度的嵌套数组
var arr = [, , [, , [, , [, ]]]];
arr.flat(); // [1, 2, 3, 4, 5, 6, 7, 8]
3.3 数组空项
在数组中有空项的时候,使用 flat()
会将中的空项进行移除。
var arr = [, , , , ];
arr.flat(); // [1, 2, 4, 5]
上面的代码中,数组中第三项是空值,在使用 flat 后会对空项进行移除。
4. 案例:深拷贝数组
使用 flat()
方法有个很好用的场景,就是深拷贝数组。我们知道 flat()
拍平后的数组不会影响源数组,那么是不是我们可以传入参数 0 让其不做扁平化操作呢?答案是可以的:
var arr1 = [, , [, , [, ]]];
var arr2 = arr1.flat();
arr2.push()
console.log(arr1) // [1, 2, [3, 4, [5, 6]]]
console.log(arr2) // [1, 2, [3, 4, [5, 6]], 100]
上面的代码中我们传入了 0 作为数组扁平化的深度,也就是不处理,然后给得到的 arr2 数组添加元素,最后打印两个数组,可以看到 arr1 没有 100,这样就达到了使用 flat()
来进行数值的深拷贝。