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。