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]

 

posted @ 2018-11-19 01:48  特兰克斯丶  阅读(2109)  评论(0编辑  收藏  举报