如果我们有一个需求,把一个tree结构的数据的第三级的数据的属性show修改成false,如果children里面的都是false那么父级的show也是false

// 测试数据
const list = [{
    label: '234234234',
    show: true,
    children: [{
            label: '123123',
            show: true,
            children: [{
                    label: '234234234',
                    show: true,
                    children: [{
                            label: '234234234',
                            show: true
                        },
                        {
                            label: '234234234',
                            show: true
                        }
                    ]
                },
                {
                    label: '234234234',
                    show: true
                },
                {
                    label: '234234234',
                    show: true,
                    children: [{
                        label: '234234234',
                        show: true
                    }]
                }
            ]
        },
        {
            label: '234234234',
            show: true
        }
    ]
}]

 

 

 

那么怎么处理这个需求呢?答案肯定是需要用到递归函数

// 测试数据
const list = [{
    label: '234234234',
    show: true,
    children: [{
            label: '123123',
            show: true,
            children: [{
                    label: '234234234',
                    show: true,
                    children: [{
                            label: '234234234',
                            show: true
                        },
                        {
                            label: '234234234',
                            show: true
                        }
                    ]
                },
                {
                    label: '234234234',
                    show: true
                },
                {
                    label: '234234234',
                    show: true,
                    children: [{
                        label: '234234234',
                        show: true
                    }]
                }
            ]
        },
        {
            label: '234234234',
            show: true
        }
    ]
}]
// 未改变之前
console.log(JSON.stringify(list, null, 4))
const deep = (roots, level = 0) => {
    for (const listElement of roots) {
        listElement.level = level
        // if (listElement.level == 1) {
        //   listElement.show = false
        // }

        if (listElement.show && listElement.level == 3) {
            listElement.show = false
            deep(list, 0)
        }
        if (listElement.children && listElement.children.length) {
            if (
                listElement.show &&
                listElement.children.filter((v) => v.show).length == 0
            ) {
                listElement.show = false
                deep(list, 0)
                break
            }

            deep(listElement.children, listElement.level + 1)
        } else {
            if (listElement.show) {
                listElement.show = false
                deep(list, 0)
            }
        }
    }
}

deep(list, 0)
// 改变之后
console.log(JSON.stringify(list, null, 4))

 

 

关键点的解析

 

首先递归要注意条件 ,否则就是会堆栈溢出也就是死循环。

注意观察代码每一次调用递归前面都有一个if 这个if就是防止死循环的。

另一个细节就是每次修改属性了以后就再次从根节点开始,这样就是可以防止漏掉父级的判断。