寫在前面:
數組扁平化是指将一個多元數組變為一維數組,如:
将多元數組:
[1, [2, 3, [4, 5]]]
轉為一維數組:
[1, 2, 3, 4, 5]
如何實作?
1.reduce
function flatten(arr) {
return arr.reduce((result, item)=> {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
reduce是數組的一種方法,它接收一個函數作為累加器,數組中的每個值(從左到右)開始縮減,最終計算為一個值;
result為結果數組,item為reduce函數每次周遊出來的數組元素,其中使用了concat函數将兩個數組連接配接合并。
concat() 方法用于連接配接兩個或多個數組;該方法不會改變現有的數組,而僅僅會傳回被連接配接數組的一個副本。
2.split
function flatten(arr) {
return arr.toString().split(',').map(function(item) {
return Number(item);
})
}
function flatten(arr) {
return arr.join(',').split(',').map(function(item) {
return parseInt(item);
})
}
調用數組的toString | join方法,将數組變為字元串然後再用split分割還原為數組。
3.flat
//arr.flat(num);
arr.flat(Infinity);
該**flat()**方法建立一個新數組,其中所有子數組元素都以遞歸方式連接配接到該數組中,直到達到指定的深度。
num值:指定周遊到多元數組中的深度,預設值為1,也就是說,如果是三維數組,并且num=1時,那麼就會得到一個二維數組。
Infinity:用于存放表示正無窮大的數值。在這裡使用則是将多元數組都轉成一維數組。
4.正則
JSON.stringify(arr).replace(/\[|\]/g, '').split(',');
JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']')
5.遞歸
const fn = arr => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
fn(arr[i]);
} else {
res5.push(arr[i]);
}
}}
fn(arr);
解決思路
總結了這幾種方式,其實歸根結底還是周遊+遞歸的邏輯;這其中考察的是對js的諸多函數的了解和使用。