ES6中將多維數組轉換爲一維數組之flat()

JavaScript中如何將嵌套的數組"拉平"變成一維數組?這個功能在實際項目中,還是用到的比較多。實際項目中也遇到過,所以

今天就在這裏做個總結,方便後續拓展~

看到網上好多資料是通過join() / oString()方法結合split()方法進行轉換,但是這樣最終得到的是一個字符串數組。有時我們原

本的數組成員並不是字符串類型的。不想處理後改變數組成員類型。那此時我麼可以用ES6中給出的手段去解決->既不會改變數

組成員類型,又簡單高效。走起吧!!!

舉例說明:

先看常用的處理方式吧,如下:

let arr1 = [1,2,[3,[4]]];
let arr2 = arr1.toString().split(',');  // ["1", "2", "3", "4"]
let arr3 = arr1.join().split(',');   // ["1", "2", "3", "4"]

上述代碼缺點:數組每一項都成字符串了。

說明:雖然有時我們需要處理成這種字符串數組,但是有時也並不想要這種結果,面對這個,解決的方案有

1、ES5中的處理手段:

使用數組map()方法,對數組中的每一項進行一個處理,然後返回符合條件的結果。

對上述的字符串數組arr2、arr3做一個類型轉換。

let arr2_dealWith = arr2.map(item => Number(item))
arr2_dealWith // [1, 2, 3, 4]

let arr3_detailWith = arr3.map(item => Number(item))
arr3_detailWith //  [1, 2, 3, 4]

說明:最後雖然結合map()方法解決了問題,但是卻使用了3個方法 toString()/join() + split() + map()) 這貌似有點恐怖呀,所以

2、ES6提供了flat()方法, 一次性即可解決掉~

let array_1 = [1, 2, 3, [4, 5], 6];
let array_1_result = array_1.flat();
array_1_result // [1, 2, 3, 4, 5, 6]

說明:

1>、該方法返回一個新數組,不會更改原數組。

2>、該方法默認只會“拉平”一層,如果想要“拉平”多層的嵌套數組,可以將flat()方法的參數寫成一個整數,表示想要拉平的層

,默認爲1。

let array_2 = [1, 2, 3, [[4], 5], 6];
let array_2_result = array_2.flat(2); //表示拉平兩層
array_2_result // [1, 2, 3, 4, 5, 6]

3>、如果嵌套20、30等層,用參數就比較麻煩(數起來,當然這麼多嵌套實際項目中是沒有的)所以,提供了用Infinity關鍵字作

爲參數->此時不管有多少層嵌套,都可以轉成一維數組。

let array_3 = [1, 2, 3, [[4, [10]], 5], 6];
let array_3_result = array_3.flat(Infinity); 
array_3_result //  [1, 2, 3, 4, 10, 5, 6]
			

注:如果有空位,flat()方法會跳過空位,這樣可以延伸出,flat()不僅能拉平數組,還能去除數組的空位這一能力。

let vacancyArray = [1, 2, 3, , 4, , 6];
let vacancyArray_result = vacancyArray.flat();
vacancyArray_result //[1, 2, 3, 4, 6]

 flatMap()方法對原數組的每個成員執行一個函數(相當於執行Array.prototype.map()),然後對返回值組成的數組執行flat()方

法。該方法返回一個新數組,不改變原數組。

let a = [1,2,3];
let res = a.flatMap((x) => [x, x * 2])
// 相當於 [[1, 2], [2, 4], [3, 6]].flat()
res // [1, 2, 2, 4, 3, 6]

說明:

1>、該方法只能展開一層。

 2>、flatMap()方法的參數是一個遍歷函數,該函數可以接受三個參數,分別是當前數組成員、當前數組成員的位置(從零開

始)、原數組。

3>、flatMap()方法還可以有第二個參數,用來綁定遍歷函數裏面的this
                
            
            

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章