Javascript 如果选择了所有子节点,如何将父树节点标记为选中

Javascript 如果选择了所有子节点,如何将父树节点标记为选中,javascript,tree,Javascript,Tree,我有一个形成树的json [{ id: 1, name: "A", isSelected: false, child: [ { id: 2, name: "B", isSelected: false, } { id: 3, name: "C", isSelected: fal

我有一个形成树的json

[{
    id: 1,
    name: "A",
    isSelected: false,
    child: [
        {
            id: 2,
            name: "B",
            isSelected: false,
        }
        {
            id: 3,
            name: "C",
            isSelected: false,
        }
    ]
},
{
    id: 4,
    name: "D",
    isSelected: false,
    child: [
        {
            id: 5,
            name: "E",
            isSelected: false,
        }
        {
            id: 6,
            name: "F",
            isSelected: false,
        }
    ]
}]
现在我有了一个选定节点的数组

[{id: 2},{id:3}]
markSelectedNodes
方法,根据所选节点数组将节点标记为所选

markSelectedNodes(_nodes) {
    _nodes.forEach((_node) => {
        // match if node exists in selected nodes
        const _isFound = this.selectedNodes.find((_selectedNode) => _selectedNode.id === _node.id);
        if (_isFound) {
            _node.isSelected = true;
        } else {
            _node.isSelected = false;
        }
        // removed the node from selecedNode list as this has been marked selected
        this.selectedNodes = this.selectedNodes.filter((_selectedNode) => _selectedNode !== _node.id);

        // go through the child
        if (_node.child && _node.child.length) {
            this.markSelectedNodes(_node.child);
        }
    });
}
现在,如果所有子节点都已标记为选中,则还应将父节点标记为选中


这可以通过堆栈实现吗?

您可以采用迭代和递归的方法,检查是否选择了每个项来更新父节点

函数更新(数组=[],ID){
return!!array.length
&&each(node=>node.isSelected=ids.includes(node.id)| | update(node.child,ids));
}
var数据=[{id:1,名称:“A”,isSelected:false,child:[{id:2,名称:“B”,isSelected:false},{id:3,名称:“C”,isSelected:false}],{id:4,名称:“D”,isSelected:false,child:[{id:5,名称:“E”,isSelected:false},{id:6,名称:“F”,isSelected:false}],
节点=[{id:2},{id:3}];
更新(数据,nodes.map(({id})=>id));
控制台日志(数据)

.as console wrapper{max height:100%!important;top:0;}
这非常有效,但有一个小问题,如果我将所选节点输入更改为空列表,它不会将节点标记为未选中