// 计算最大层级
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);
网友评论