数组的扁平化是指将多维数组转换成一位数组。
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10]; //多维数组
let flatArr = [1, 2, 2, 6, 11, 12, 10]; // 一维数组
递归方法
function flatten(arr){
let flatArr = [];
for(let i=0; i<arr.length; i++){
let item = arr[i];
if(Array.isArray(item)){ // 如果item还是数组,递归调用函数
flatArr = flatArr.concat( flatten(item) )
}else{ // item不是数组直接push进新的数组
flatArr.push( item )
}
}
return flatArr
}
用数组的reduce方法来简化递归操作
function flatten(arr){
let flatArr = arr.reduce((prev, next) => {
return prev.concat( Array.isArray(next)? flatten(next):next )
}, [])
return flatArr
}
用数组的toString或者join方法
toString方法会将数组转化成移逗号隔开的字符串,join方法其实是重现了toString方法,但是可以给join方法提供一个参数,这个参数用来分隔生成的字符串。
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10];
function flatten(arr){
let strArr = arr.toString(); // 先将数组转化成字符串 "1,2,2,5,11,12,10"
return strArr.split(',') // 再用split方法将字符串变成数组
}
function flatten(arr){
let strArr = arr.join(','); // join方法有和toString方法一样的效果
return strArr.split(',') // 这里只要保证给split的参数和join的参数一样就行了
}
用es6数组的flat方法
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10];
let flatArr = arr.flat(); // [1, 2, 2, 6, 11, 12, 10]
利用loadsh工具库
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10];
_.flatten(arr); // flatten方法只能减少一级嵌套深度
// [1, 2, 2, 6, [11, 12], 10]
_.flattenDeep(arr); // flattenDeep方法不管数组有多少层,都会处理成一层
// [1, 2, 2, 6, 11, 12, 10]
_.flattenDepth(arr, depth); // flattenDepth会根据提供的depth来减少数组的嵌套层数
_.flattenDepth(arr, 1); // [1, 2, 2, 6, [11, 12], 10]
_.flattenDepth(arr, 2); // [1, 2, 2, 6, 11, 12, 10]