JS递归补全子节点

2019-12-23  本文已影响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);
上一篇 下一篇

猜你喜欢

热点阅读