JavaScript递归实现数据结构转换 - 将扁平数据转换为树状结构
// 递归函数实现 function generateResult(data) { const result = []; const map = {};
data.forEach((item) => { const { companyName, comanyNo, projectName, projectNo, siteName, siteNo, total } = item;
if (!map[companyName]) {
const companyIndex = Object.keys(map).length + 1;
map[companyName] = {
index: `${companyIndex}`,
companyName,
comanyNo,
total: 0,
children: [],
};
result.push(map[companyName]);
}
const company = map[companyName];
if (!company.children.find((child) => child.projectName === projectName && child.projectNo === projectNo)) {
const projectIndex = company.children.length + 1;
company.children.push({
index: `${company.index}-${projectIndex}`,
projectName,
projectNo,
total: 0,
children: [],
});
}
const project = company.children.find((child) => child.projectName === projectName && child.projectNo === projectNo);
if (!project.children.find((child) => child.siteName === siteName && child.siteNo === siteNo)) {
const siteIndex = project.children.length + 1;
project.children.push({
index: `${project.index}-${siteIndex}`,
siteName,
siteNo,
total: 0,
});
}
const site = project.children.find((child) => child.siteName === siteName && child.siteNo === siteNo);
site.total += total;
project.total += total;
company.total += total;
});
return 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, }, ];
const result = generateResult(data); console.log(result);
原文地址: https://www.cveoy.top/t/topic/peiN 著作权归作者所有。请勿转载和采集!