以下是使用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。

JavaScript 递归实现数据树状结构转换 - 固废处理案例

原文地址: https://www.cveoy.top/t/topic/pek3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录