天天看點

面試題-js數組扁平化

寫在前面:

數組扁平化是指将一個多元數組變為一維數組,如:

将多元數組:
[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的諸多函數的了解和使用。

繼續閱讀