🧐 什么是数组扁平化
将嵌套多层的数组“拉平”,变为一维数组。
🤔 为什么要数组扁平化
去除冗余,厚重和繁杂的装饰效果。
😎 如何进行数组扁平化
方法一:递归实现
思路就是通过循环递归的方式,一项一项的去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,来实现数组每一项的连接
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
let result=[];
for(let i=0;i<arr.length;i++){
if(Array.isArray(arr[i]){
result=result.concat(flatten(arr[i]);
}else{
result.push(arr[i]);
}
}
return result;
}
flatten(arr);
方法二:reduce函数递归
从上面的普通的递归函数中可以看出,其实就是对数组的每一项进行处理,那么其实也可以用reduce来实现数组的拼接,从而简化第一种方式的代码
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
return arr.reduce(function(prev,next){
return prev.concat(Array.isArray(next)?flatten(next):next)
},[])
}
flatten(arr);
方法三:拓展运算符实现
这个方法的实现,采用了拓展运算符和some的方法,两者共同使用,达到数组扁平化的目的
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
while(arr.some(itme=>Array.isArray(item))){
arr=[].concat(...arr);
}
return arr;
}
flatten(arr);
方法四:split和toString
可以通过split和toString两个方法来共同实现数组扁平化,由于数组会默认带一个toString方法,所以可以把数组直接转换成逗号分隔的字符串,然后再用split方法把字符串重新转换为数组。
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
return arr.toString().split(',');
}
flatten(arr);
方法五:ES6中的flat
flat方法的语法:arr.flat([depth]) ,其中depth是可以传递数组的展开深度(默认不填,数值为1),即展开一层数组。如果层数不确定,参数可以传进Infinity,代表不论多少层都要展开;
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
return arr.flat(Infinity);
}
flatten(arr);
方法六:正则和JSON方法
先用JSON.stringify的方法转换为字符串,然后通过正则表达式过滤掉字符串中的数组的方括号,最后再利用JSON.parse把它转换成数组
let arr=[1,[2,[3,4,5]]];
function flatten(arr){
let str=JSON.stringify(arr);
str=str.replace(/(\[|\])/g,'');
str='['+str+']';
return JSON.parse(str);
}
flatten(arr);
|