1. 程式人生 > >ES6 三層for迴圈的鏈式寫法

ES6 三層for迴圈的鏈式寫法

假設有一個很複雜的資料,並且資料巢狀層數很多。如何避免用三層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]