JavaScript 递归实现数据树状结构转换 - 固废处理案例
以下是使用JavaScript和递归来实现输入数据data,并期望输出结果result的示例代码:
const data = [
{
companyName: '固废处理公司',
comanyNo: '111 ',
projectName: '主城区应急填埋',
projectNo: '111 ',
siteName: '洛城清理场',
siteNo: '111 ',
total: 30,
},
{
companyName: '固废处理公司',
comanyNo: '111 ',
projectName: '主城区应急填埋',
projectNo: '111 ',
siteName: '黑石子填埋场',
siteNo: '112 ',
total: 50,
},
{
companyName: '固废处理公司',
comanyNo: '111 ',
projectName: '其他区域应急填埋',
projectNo: '112 ',
siteName: '花溪填埋场',
siteNo: '113',
total: 100,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '市级转运',
projectNo: '222 ',
siteName: '界石站',
siteNo: '222 ',
total: 100,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '市级转运',
projectNo: '222 ',
siteName: '走马站',
siteNo: '223 ',
total: 60,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '市级转运',
projectNo: '222 ',
siteName: '夏家坝站',
siteNo: '224 ',
total: 30,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '市级转运',
projectNo: '222 ',
siteName: '西永站',
siteNo: '225 ',
total: 80,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '高校餐厨转运',
projectNo: '223 ',
siteName: '西永站',
siteNo: '226 ',
total: 80,
},
{
companyName: '固废运输公司',
comanyNo: '222 ',
projectName: '渝北区餐厨转运',
projectNo: '224 ',
siteName: '冉家坝站',
siteNo: '227 ',
total: 180,
},
];
function buildTree(data) {
const result = [];
// 递归函数
function recursive(data, parent) {
const map = new Map(); // 用于存储相同父级的节点
for (const item of data) {
if (!map.has(item.comanyNo)) {
map.set(item.comanyNo, {
companyName: item.companyName,
comanyNo: item.comanyNo,
total: 0,
children: [],
});
}
const node = map.get(item.comanyNo);
node.total += item.total;
if (parent) {
parent.total += item.total;
}
if (item.projectName && item.projectNo) {
node.children.push({
companyName: item.companyName,
comanyNo: item.comanyNo,
projectName: item.projectName,
projectNo: item.projectNo,
total: item.total,
children: [],
});
}
if (item.siteName && item.siteNo) {
node.children[node.children.length - 1].children.push({
companyName: item.companyName,
comanyNo: item.comanyNo,
projectName: item.projectName,
projectNo: item.projectNo,
siteName: item.siteName,
siteNo: item.siteNo,
total: item.total,
});
}
}
for (const child of map.values()) {
parent ? parent.children.push(child) : result.push(child);
if (child.children.length > 0) {
recursive(child.children, child);
}
}
}
recursive(data, null);
return result;
}
const result = buildTree(data);
console.log(result);
这段代码会根据输入的数据data构建一个树形结构,并返回期望的输出结果result。使用递归的方式,可以将数据按照要求的层级关系进行组织,并计算每个节点的总计数。最后,根据每个节点是否有子节点,将节点添加到父节点的children数组中。
运行以上代码会在控制台打印输出结果result。
原文地址: https://www.cveoy.top/t/topic/pek3 著作权归作者所有。请勿转载和采集!