數(shù)組的扁平化是指將多維數(shù)組轉(zhuǎn)換成一位數(shù)組错忱。
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10]; //多維數(shù)組
let flatArr = [1, 2, 2, 6, 11, 12, 10]; // 一維數(shù)組
遞歸方法
function flatten(arr){
let flatArr = [];
for(let i=0; i<arr.length; i++){
let item = arr[i];
if(Array.isArray(item)){ // 如果item還是數(shù)組亚脆,遞歸調(diào)用函數(shù)
flatArr = flatArr.concat( flatten(item) )
}else{ // item不是數(shù)組直接push進(jìn)新的數(shù)組
flatArr.push( item )
}
}
return flatArr
}
用數(shù)組的reduce方法來簡化遞歸操作
function flatten(arr){
let flatArr = arr.reduce((prev, next) => {
return prev.concat( Array.isArray(next)? flatten(next):next )
}, [])
return flatArr
}
用數(shù)組的toString或者join方法
toString方法會將數(shù)組轉(zhuǎn)化成移逗號隔開的字符串溜在,join方法其實是重現(xiàn)了toString方法术瓮,但是可以給join方法提供一個參數(shù)台妆,這個參數(shù)用來分隔生成的字符串女淑。
let arr = [ [1, 2, 2], [6, [11, 12 ]], 10];
function flatten(arr){
let strArr = arr.toString(); // 先將數(shù)組轉(zhuǎn)化成字符串 "1,2,2,5,11,12,10"
return strArr.split(',') // 再用split方法將字符串變成數(shù)組
}
function flatten(arr){
let strArr = arr.join(','); // join方法有和toString方法一樣的效果
return strArr.split(',') // 這里只要保證給split的參數(shù)和join的參數(shù)一樣就行了
}
用es6數(shù)組的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方法不管數(shù)組有多少層湿酸,都會處理成一層
// [1, 2, 2, 6, 11, 12, 10]
_.flattenDepth(arr, depth); // flattenDepth會根據(jù)提供的depth來減少數(shù)組的嵌套層數(shù)
_.flattenDepth(arr, 1); // [1, 2, 2, 6, [11, 12], 10]
_.flattenDepth(arr, 2); // [1, 2, 2, 6, 11, 12, 10]