ES6 三層for迴圈的鏈式寫法
阿新 • • 發佈:2018-11-19
假設有一個很複雜的資料,並且資料巢狀層數很多。如何避免用三層for迴圈呢?
有以下梨子,我們需要找到val值為12的,這個物件?
'use strict' let groups = [{ content: [{ permissions: [{ val: 1 }, { val: 2 }] }, { permissions: [{ val:3 }, { val: 4 }] }] }, { content: [{ permissions: [{ val: 5 }, { val: 6 }] }, { permissions: [{ val:7 }, { val: 8 }] }] }, { content: [{ permissions: [{ val: 9 }, { val: 10 }] }, { permissions: [{ val:11 }, { val: 12 }] }] }] console.log(groups); let filterA = groups .map(a => a.content) .flat() //陣列扁平化 .map(b => b.permissions) .flat() .filter(c => c.val === 12) console.log(filterA);
由於flat語法,需要在chrome69以上版本來進行除錯哦
let filterA = groups .map(a => a.content) .flat() //陣列扁平化 .map(b => b.permissions) .flat() .filter(c => c.val === 12)
程式碼的邏輯比較簡單,符合函數語言程式設計的思想。
map//返回一堆新陣列,不改變源陣列,我們就可以獲取到下一層,但是陣列的層數依舊還是3層,
所以需要flat,來消除一層陣列,也就陣列扁平化。
參考阮老師的解釋
flat()預設只會“拉平”一層,如果想要“拉平”多層的巢狀陣列,可以將flat()方法的引數寫成一個整數,表示想要拉平的層數,預設為1。 [1, 2, [3, [4, 5]]].flat() // [1, 2, 3, [4, 5]] flat()的引數為2,表示要“拉平”兩層的巢狀陣列 [1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5] 如果不管有多少層巢狀,都要轉成一維陣列,可以用Infinity關鍵字作為引數。 [1, [2, [3]]].flat(Infinity) // [1, 2, 3]