js树状结构树组递归并修改状态?

const arr = [{
            "id": "BC",
            "selected": true,
            "partiallySelected": false,
            "count": 175400,
            "childrens": [{
                "id": "BC-SRV",
                "selected": false,
                "partiallySelected": false,
                "count": 22609,
                "childrens": [{
                    "id": "BC-SRV-COM",
                    "selected": false,
                    "partiallySelected": false,
                    "count": 2304,
                    "childrens": [{
                        "id": "BC-SRV-COM-FTP",
                        "selected": false,
                        "partiallySelected": false,
                        "count": 187,
                        "childrens":[]
                    }, {
                        "id": "BC-SRV-COM-TEL",
                        "selected": false,
                        "partiallySelected": false,
                        "count": 137,
                        "childrens":[]
                    }, {
                        "id": "BC-SRV-COM-MSX",
                        "selected": false,
                        "partiallySelected": false,
                        "count": 222,
                        "childrens":[]
                    }, {
                         "id": "BC-SRV-COM-QQQ",
                         "selected": false,
                         "partiallySelected": false,
                         "count": 156,
                         "childrens":[]
                     }]
                }, {
                    "id": "BC-SRV-BR",
                    "selected": false,
                    "partiallySelected": false,
                    "count": 2093,
                    "childrens": []
                }, {
                    "id": "BC-SRV-GBT",
                    "selected": false,
                    "partiallySelected": false,
                    "count": 2133,
                    "childrens": []
                }]
            }, {
                "id": "BC-DB",
                "selected": false,
                "partiallySelected": false,
                "count": 20388,
                "childrens":[]
            }, {
                "id": "BC-SYB",
                "selected": true,
                "partiallySelected": false,
                "count": 13764,
                "childrens":[]
            }, {
                 "id": "BC-SYY",
                 "selected": true,
                 "partiallySelected": true,
                 "count": 22610,
                 "childrens":[]
             }]
        }];

递归树组,父节点selectedtruepartiallySelectedfasle的时候,所有子节点childrens下的节点的selected则也修改为true
syncChildrenStatus(arr)
希望得到的

newArr = [{
            "id": "BC",
            "selected": true,
            "partiallySelected": false,
            "count": 175400,
            "childrens": [{
                "id": "BC-SRV",
                "selected": true,
                "partiallySelected": false,
                "count": 22609,
                "childrens": [{
                    "id": "BC-SRV-COM",
                    "selected": true,
                    "partiallySelected": false,
                    "count": 2304,
                    "childrens": [{
                        "id": "BC-SRV-COM-FTP",
                        "selected": true,
                        "partiallySelected": false,
                        "count": 187,
                        "childrens":[]
                    }, {
                        "id": "BC-SRV-COM-TEL",
                        "selected": true,
                        "partiallySelected": false,
                        "count": 137,
                        "childrens":[]
                    }, {
                        "id": "BC-SRV-COM-MSX",
                        "selected": true,
                        "partiallySelected": false,
                        "count": 222,
                        "childrens":[]
                    }, {
                         "id": "BC-SRV-COM-QQQ",
                         "selected": true,
                         "partiallySelected": false,
                         "count": 156,
                         "childrens":[]
                     }]
                }, {
                    "id": "BC-SRV-BR",
                    "selected": true,
                    "partiallySelected": false,
                    "count": 2093,
                    "childrens": []
                }, {
                    "id": "BC-SRV-GBT",
                    "selected": true,
                    "partiallySelected": false,
                    "count": 2133,
                    "childrens": []
                }]
            }, {
                "id": "BC-DB",
                "selected": true,
                "partiallySelected": false,
                "count": 20388,
                "childrens":[]
            }, {
                "id": "BC-SYB",
                "selected": true,
                "partiallySelected": false,
                "count": 13764,
                "childrens":[]
            }, {
                 "id": "BC-SYY",
                 "selected": true,
                 "partiallySelected": true,
                 "count": 22610,
                 "childrens":[]
             }]
        }]
阅读 2.7k
1 个回答
function syncChildrenStatus(arr) {
  return arr.map(v => ({
    ...v,
    childrens: v.selected && !v.partiallySelected ? JSON.parse(JSON.stringify(v.childrens),(k,v) => k === 'selected' ? true : v) : syncChildrenStatus(v.childrens)
  }))
}

修改原数组:

function syncChildrenStatus(arr) {
  (function setNodeSelected(list, bol){
    list.forEach(v => {v.selected ||= bol;setNodeSelected(v.childrens, bol || v.selected && !v.partiallySelected)})
  })(arr, false)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题