美文网首页
js 递归处理数据之每个层级下子集累计某个参数求和

js 递归处理数据之每个层级下子集累计某个参数求和

作者: 甘道夫老矣 | 来源:发表于2023-04-17 13:13 被阅读0次

    场景:现需要一个树形数据,计算出每个层级下,子集中某个参数的累加和

    let nodes= [
                {
                    title: '顶顶顶顶',
                    key: '0-0',
                    num: 0,
                    expanded: true,
                    children: [
                        {
                            title: '啊啊啊啊',
                            key: '0-0-0',
                            num: 100,
                            checked: true,
                            isLeaf: true,
                        },
                        {
                            title: '大大大',
                            key: '0-0-1',
                            checked: true,
                            isLeaf: true,
                            num: 100,
                        },
                    ]
                },
                {
                    title: '反反复复',
                    key: '0-1',
                    num: 0,
                    children: [
                        {
                            title: '灌灌灌灌',
                            num: 100,
                            key: '0-1-0-0',
                            checked: true,
                            isLeaf: true
                        },
                        {
                            title: '呜呜呜呜',
                            num: 100,
                            key: '0-2-0-0',
                            checked: false,
                            isLeaf: true
                        },
                    ]
                }
            ];
     changeTreeData(nodes: any): void {
            nodes.forEach((item: any) => {
                if (item.children) {
                    item.children = this.changeTreeData(item.children);
                    item.num = 0;
                    item.children.forEach((elm: any) => {
                         item.num += elm.num;
                    })
                 
                }
            })
            return nodes;
        }
    this.changeTreeData(nodes);
    

    场景二:同场景1需求,附加仅支持勾选复选框的累加

    let nodes= [
                {
                    title: '顶顶顶顶',
                    key: '0-0',
                    num: 0,
                    expanded: true,
                    children: [
                        {
                            title: '啊啊啊啊',
                            key: '0-0-0',
                            num: 100,
                            checked: true,
                            isLeaf: true,
                        },
                        {
                            title: '大大大',
                            key: '0-0-1',
                            checked: true,
                            isLeaf: true,
                            num: 100,
                        },
                    ]
                },
                {
                    title: '反反复复',
                    key: '0-1',
                    num: 0,
                    children: [
                        {
                            title: '灌灌灌灌',
                            num: 100,
                            key: '0-1-0-0',
                            checked: true,
                            isLeaf: true
                        },
                        {
                            title: '呜呜呜呜',
                            num: 100,
                            key: '0-2-0-0',
                            checked: false,
                            isLeaf: true
                        },
                    ]
                }
            ];
    changeTreeData(nodes: any): void {
            nodes.forEach((item: any) => {
                if (item.children) {
                    item.children = this.changeTreeData(item.children);
                    item.num = 0;
                    item.children.forEach((elm: any) => {
                        if (elm.checked && elm.isLeaf) {
                            item.num += elm.num;
                        }
                    })
                    if (item.num === 0) {
                        item.num = this.changeTotal(item);
                    }
                }
            })
            return nodes;
        }
    
        changeTotal(itemObj: any): any {
            let sum = itemObj.num;
            if (itemObj.children && itemObj.children.length > 0) {
                for (let child of itemObj.children) {
                    if (!child.isLeaf) {
                        sum += child.num;
                    }
                }
            }
            return sum;
        }
    this.changeTreeData(nodes);
    

    相关文章

      网友评论

          本文标题:js 递归处理数据之每个层级下子集累计某个参数求和

          本文链接:https://www.haomeiwen.com/subject/oclcddtx.html