改变数据结构的值

我这有样的一个数据对象

[
    {
        name: '将军',
        checked: false,
        vt:false,
        child: [
            {
                name: '师长1',
                checked: true,
                vt:false,
                child: [
                    {name: '营长1', checked: false},
                    {name: '营长2', checked: true},
                ]
            },
            {
                name: '师长2',
                checked: true,
                vt:false,
                child: [
                    {name: '营长3', checked: true},
                    {name: '营长4', checked: true},
                ]
            },
            {
                name: '师长3',
                checked: true,
                vt:false,
                child: [
                    {name: '营长5', checked: false},
                    {name: '营长6', checked: false},
                ]
            },
        ]
    }
]

我想把他变成下面这样

[
    {
        name: '将军',
        checked: false,
        vt: true,
        child: [
            {
                name: '师长1',
                checked: false,
                vt: true,
                child: [
                    {name: '营长1', checked: false},
                    {name: '营长2', checked: true},
                ]
            },
            {
                name: '师长2',
                checked: true,
                vt: false
                child: [
                    {name: '营长3', checked: true},
                    {name: '营长4', checked: true},
                ]
            },
            {
                name: '师长3',
                checked: false,
                vt:false,
                child: [
                    {name: '营长5', checked: false},
                    {name: '营长6', checked: false},
                ]
            },
        ]
    }
]

就是递归数据对象到最后一级,如果他的最后一级营长级别checked都为true,
vt为false
他的上一级父级师长的checked就为true,vt为false
师长级别的父级(第一级)将军又要看最后一级的营长是否为全选中状态
如果是全选中状态checked才能为true 不然只能为false vt为ture
但是如果最后一级的营长都是false 他的父级checked和vt都为false
这种数据结构要怎么改变他的值?
以此类推更多层级的时候也是一样
在此先感谢了

vt 代表下面的横杠 checked代表下面的打勾

效果图如下
image.png


运行两位 @PPxs199 Mc1296 的代码结果在三级上可以 但是在四级下却成这样的了
image.png
我期望的结果是
image.png

我不知道这样两位大神是否明白
就是如果最后一级是没选中的他的父级是没有任何状态的
vt为false,checked为false
如果有其中一个选中他的父级
vt为true,checked为false
如果最后一级全选中他的父级
vt为false,checked为true
就是每个层级都要看他最后一级的checked来决定当前状态

这是四级的data,
我觉得难就难在从最后一级来决定他的所有父级状态

{
                "name":"将军",
                "checked": false,
                "vt": true,
                "child":[
                    {
                        "name":"师长",
                        "checked":false,
                        "vt": false,
                        "child":[
                            {
                                "name":"营长",
                                "checked":false,
                                "vt": false,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": false
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": true
                                    },
                                ]
                            }
                        ]
                    },
                    {
                        "name":"师长2",
                        "checked":false,
                        "vt": true,
                        "child":[
                            {
                                "name":"营长2",
                                "checked":false,
                                "vt": true,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": false
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": false
                                    },
                                ]
                            }
                        ]
                    },
                    {
                        "name":"师长3",
                        "checked":true,
                        "vt": false,
                        "child":[
                            {
                                "name":"营长2",
                                "checked":true,
                                "vt": false,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": true
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": true
                                    },
                                ]
                            }
                        ]
                    },
                ]
            }
阅读 1.8k
2 个回答
function c (z) {
    if (z.forEach) {
       z.forEach(d => c(d));
       return;
    }
    if (z.child) {
        let cl = z.child.length;
        z.child.forEach((b, i) => {
            !c(b) && (cl--);
        });
        z.checked = cl === z.child.length;
        z.vt = !z.checked && Boolean(cl);
    }
    return z.checked;
}

var test = [
    {
        name: '将军',
        checked: false,
        vt:false,
        child: [
            {
                name: '师长1',
                checked: true,
                vt:false,
                child: [
                    {name: '营长1', checked: false},
                    {name: '营长2', checked: true},
                ]
            },
            {
                name: '师长2',
                checked: true,
                vt:false,
                child: [
                    {name: '营长3', checked: true},
                    {name: '营长4', checked: true},
                ]
            },
            {
                name: '师长3',
                checked: true,
                vt:false,
                child: [
                    {name: '营长5', checked: false},
                    {name: '营长6', checked: false},
                ]
            },
        ]
    }
];
console.log('after', c(test) || test);



// 补充
function c1 (z) {
    if (z.forEach) {
       z.forEach(d => c(d));
       return;
    }
    if (z.child) {
        let cl = z.child.length,
            vt = false;
        z.child.forEach((b, i) => {
            !c(b) && (cl--);
            vt = b.vt || vt;
        });
        z.checked = cl === z.child.length;
        z.vt = !z.checked && Boolean(cl) || vt;
    }
    return z.checked;
}

PPxs199
就是我如果换成四级后就变成这种情况了
image.png

这是四级数据

var list = [
            {
                "name":"将军",
                "checked": false,
                "vt": true,
                "child":[
                    {
                        "name":"师长",
                        "checked":false,
                        "vt": false,
                        "child":[
                            {
                                "name":"营长",
                                "checked":false,
                                "vt": false,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": false
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": true
                                    },
                                ]
                            }
                        ]
                    },
                    {
                        "name":"师长2",
                        "checked":false,
                        "vt": true,
                        "child":[
                            {
                                "name":"营长2",
                                "checked":false,
                                "vt": true,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": false
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": false
                                    },
                                ]
                            }
                        ]
                    },
                    {
                        "name":"师长3",
                        "checked":true,
                        "vt": false,
                        "child":[
                            {
                                "name":"营长2",
                                "checked":true,
                                "vt": false,
                                "child":[
                                    {
                                        "name":"连长1",
                                        "checked": true
                                    },
                                    {
                                        "name":"连长2",
                                        "checked": true
                                    },
                                ]
                            }
                        ]
                    },
                ]
            }
        ];
        
        
function c (z) {
    if (z.forEach) {
    z.forEach(d => c(d));
    return;
    }
    if (z.child) {
        let cl = z.child.length;
        z.child.forEach((b) => {
            !c(b) && (cl--);
        });
        z.checked = cl === z.child.length;
        z.vt = !z.checked && Boolean(cl);

    }
    return z.checked;
}
c(list);

而我期望的数据是这样的

[
    {
        "name":"将军",
        "checked": false,
        "vt": true,
        "child":[
            {
                "name":"师长",
                "checked":false,
                "vt": true,
                "child":[
                    {
                        "name":"营长",
                        "checked":false,
                        "vt": true,
                        "child":[
                            {
                                "name":"连长1",
                                "checked": false
                            },
                            {
                                "name":"连长2",
                                "checked": true
                            },
                        ]
                    }
                ]
            },
            {
                "name":"师长2",
                "checked":false,
                "vt": false,
                "child":[
                    {
                        "name":"营长2",
                        "checked":false,
                        "vt": false,
                        "child":[
                            {
                                "name":"连长1",
                                "checked": false
                            },
                            {
                                "name":"连长2",
                                "checked": false
                            },
                        ]
                    }
                ]
            },
            {
                "name":"师长3",
                "checked":true,
                "vt": false,
                "child":[
                    {
                        "name":"营长2",
                        "checked":true,
                        "vt": false,
                        "child":[
                            {
                                "name":"连长1",
                                "checked": true
                            },
                            {
                                "name":"连长2",
                                "checked": true
                            },
                        ]
                    }
                ]
            },
        ]
    }
]

三级也是

[

    {
       name:"将军",
       checked: true,
       child:[
            {
               name:"师长",
               checked: false,
               child:[
                    {
                       name:"营长1",
                       checked: true
                    },
                    {
                       name:"营长2",
                       checked: false
                    }
                ]
            }
        ]
    }
]

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题