美文网首页
JS递归补全子节点

JS递归补全子节点

作者: 未然猜 | 来源:发表于2019-12-23 17:38 被阅读0次
    // 计算最大层级
    var getMaxLevel = function(data){
        // 深拷贝
        let nodeQueue = JSON.parse(JSON.stringify(data));
        let index = 0;
        // 遍历
        while (index < nodeQueue.length) {
            let node = nodeQueue[index];
            node.level = node.level ? node.level : 0;
            if (node.children) {
                node.children.forEach(item => {
                    item.level = node.level + 1;
                    // 添加队列
                    nodeQueue.push(item);
                })
            }
            index += 1;
        }
        let maxLevel = nodeQueue[nodeQueue.length-1].level;
        return maxLevel;
    };
    
    // 检测每个item中value值是否等于次级子节点value值
    var isLevelValueEqual = function(data, level, maxLevel) {
        level = level ? level : 0;
        data.forEach(item => {
            // 当前节点value
            let currentValue = item.value ? item.value : 0;
            item.level = level;
            // 存在子节点
            let childValue = 0;
            if (item.children) {
                item.children.forEach(child => {
                    child.level = item.level + 1;
                    childValue += child.value ? child.value : 0
                })
            // 没有子节点时先补全再退出
            } else {
                // 不超过最大层级时补全
                if (item.level < maxLevel) {
                    item.children = [{
                        value: item.value,
                        level: item.level + 1,
                        itemStyle: '向下补全'
                    }]
                // 递归补全缺失children
                isLevelValueEqual(item.children, item.level + 1)
                // 补全后直接退出
                return
                } else {
                    return
                }
            }
            // 溢出
            if (currentValue < childValue) {
                // TODO 溢出处理
            // 补全值
            } else if (currentValue > childValue){
                // 补全
                item.children.push({
                    value: currentValue - childValue,
                    level: item.level + 1,
                    itemStyle: '同级补全'
                })
            }
            // 递归
            isLevelValueEqual(item.children, item.level + 1)
        })
    }
    
    // var data = [{
    //     "value": 5,
    //     "children": [{
    //         "value": 1,
    //         "itemStyle": "item1"
    //     }, {
    //         "value": 2,
    //         "children": [{
    //             "value": 1,
    //             "itemStyle": "item2"
    //         }]
    //     }],
    //     "itemStyle": "item1"
    // }, {
    //     "value": 5,
    //     "children": [{
    //         "value": 1,
    //         "itemStyle": "item1"
    //     }],
    //     "itemStyle": "item1"
    // }, {
    //     "value": 9,
    //     "itemStyle": "item1"
    // }];
    var data = [{
        children: [{
            value: 5,
            children: [{
                value: 1,
                itemStyle: 'item1'
            }, {
                value: 2,
                children: [{
                    value: 1,
                    itemStyle: 'item2'
                }]
            }, {
                children: [{
                    value: 1
                }]
            }],
            itemStyle: 'item1'
        }, {
            value: 10,
            children: [{
                value: 6,
                children: [{
                    value: 1,
                    itemStyle: 'item1'
                }, {
                    value: 1
                }, {
                    value: 1,
                    itemStyle: 'item2'
                }, {
                    value: 1
                }],
                itemStyle: 'item3'
                }, {
                value: 2,
                children: [{
                    value: 1
                }],
                itemStyle: 'item3'
                }, {
                children: [{
                    value: 1,
                    itemStyle: 'item2'
                }]
            }],
            itemStyle: 'item1'
        }],
        value: 15,
        itemStyle: 'item1'
    }, {
        value: 9,
        children: [{
            value: 4,
            children: [{
                value: 2,
                itemStyle: 'item2'
            }, {
                children: [{
                    value: 1,
                    itemStyle: 'item1'
                }]
            }],
            itemStyle: 'item1'
        }, {
            children: [{
                value: 3,
                children: [{
                    value: 1
                }, {
                    value: 1,
                    itemStyle: 'item2'
                }]
            }],
            itemStyle: 'item3'
        }],
        itemStyle: 'item2'
    }, {
        value: 7,
        children: [{
            children: [{
                value: 1,
                itemStyle: 'item3'
            }, {
                value: 3,
                children: [{
                    value: 1,
                    itemStyle: 'item2'
                }, {
                    value: 1
                }],
                itemStyle: 'item2'
            }, {
                value: 2,
                children: [{
                    value: 1
    }, {                value: 1,
                    itemStyle: 'item1'
                }],
                itemStyle: 'item1'
            }],
            itemStyle: 'item3'
        }],
        itemStyle: 'item2'
    }, {
        children: [{
            value: 6,
            children: [{
                value: 1,
                itemStyle: 'item2'
            }, {
                value: 2,
                children: [{
                    value: 2,
                    itemStyle: 'item2'
                }],
                itemStyle: 'item1'
            }, {
                value: 1,
                itemStyle: 'item3'
            }],
            itemStyle: 'item3'
        }, {
            value: 3,
            children: [{
                value: 1,
            }, {
                children: [{
                    value: 1,
                    itemStyle: 'item2'
                }]
            }, {
                value: 1
            }],
            itemStyle: 'item3'
        }],
        itemStyle: 'item3',
        value: 3
    }];
    
    // 计算最大层级
    maxLevel = getMaxLevel(data);
    // 数据重槊
    isLevelValueEqual(data, 0, maxLevel);
    // 查看结果
    JSON.stringify(data);
    

    相关文章

      网友评论

          本文标题:JS递归补全子节点

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