js前端数据改造算法

数据改造
将数据结构

[
{"name":"归因数据","name1":"称料","name2":"PTW1","value":"50"},
{"name":"归因数据","name1":"称料","name2":"YC99","value":"80"},
{"name":"归因数据","name1":"称料","name2":"GW","value":"40"},
{"name":"归因数据","name1":"搅磨","name2":"隔膜泵转速","value":"10.06"},
{"name":"归因数据","name1":"搅磨","name2":"时长","value":"10"},
{"name":"归因数据","name1":"搅磨","name2":"搅磨主机转速","value":"30.13"},
{"name":"归因数据","name1":"固液分离","name2":"分离时长","value":"1.083"},
{"name":"归因数据","name1":"干燥","name2":"干燥时长","value":"0.5"},
{"name":"归因数据","name1":"干燥","name2":"主机转速","value":"40"},
{"name":"归因数据","name1":"干燥","name2":"主机温度","value":"68"},
{"name":"归因数据","name1":"干燥","name2":"主机内压强","value":"-0.05"},
{"name":"归因数据","name1":"干燥","name2":"氮气流量","value":"5"},
{"name":"归因数据","name1":"设备磨损度","name2":"300L 搅磨机 ","value":"0.12"},
{"name":"归因数据","name1":"设备磨损度","name2":"500L 搅磨机 ","value":"0.43"},
{"name":"归因数据","name1":"设备磨损度","name2":"离心机","value":"0.22"},
{"name":"归因数据","name1":"设备磨损度","name2":"耙式干燥机","value":"0.01"},
{"name":"归因数据","name1":"设备磨损度","name2":"振筛机","value":"0.21"},
{"name":"归因数据","name1":"设备磨损度","name2":"卧式球磨机","value":"0.31"},
{"name":"归因数据","name1":"设备磨损度","name2":"混料机","value":"0.22"},
{"name":"归因数据","name1":"设备磨损度","name2":"200L 搅磨机","value":"0.03"},
{"name":"归因数据","name1":"设备磨损度","name2":"真空抽滤机","value":"0.12"},
{"name":"归因数据","name1":"设备磨损度","name2":"真空回转干燥机","value":"0.44"},
{"name":"归因数据","name1":"设备制造商","name2":"300L 搅磨机 ","value":"西门子"},
{"name":"归因数据","name1":"设备制造商","name2":"500L 搅磨机 ","value":"施耐德"},
{"name":"归因数据","name1":"设备制造商","name2":"离心机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"耙式干燥机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"振筛机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"卧式球磨机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"混料机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"200L 搅磨机","value":"施耐德"},
{"name":"归因数据","name1":"设备制造商","name2":"真空抽滤机","value":"中国重工"},
{"name":"归因数据","name1":"设备制造商","name2":"真空回转干燥机","value":"西门子"},
{"name":"归因数据","name1":"班组人员","name2":"干燥操作人","value":"李刚"},
{"name":"归因数据","name1":"班组人员","name2":"干燥复核人","value":"匡洪波"},
{"name":"归因数据","name1":"班组人员","name2":"称料操作人","value":"匡洪波"},
{"name":"归因数据","name1":"班组人员","name2":"称料复核人","value":"朱肖涵"},
{"name":"归因数据","name1":"班组人员","name2":"搅磨操作人","value":"匡洪波"},
{"name":"归因数据","name1":"班组人员","name2":"搅磨复核人","value":"朱肖涵"},
{"name":"归因数据","name1":"班组人员","name2":"固液分离操作人","value":"李刚"},
{"name":"归因数据","name1":"班组人员","name2":"固液分离复核人","value":"匡洪波"}]

改造成

{ "name":"归因数据",
    "children":[
        {
            "children":[
                {
                    "name":"PTW1",
                    "value":"50"
                },
                {
                    "name":"YC99",
                    "value":"80"
                },
                {
                    "name":"GW",
                    "value":"40"
                }
            ],
            "name":"称料"
        },
        {
            "children":[
                {
                    "name":"隔膜泵转速",
                    "value":"10.06"
                },
                {
                    "name":"时长",
                    "value":"10"
                },
                {
                    "name":"搅磨主机转速",
                    "value":"30.13"
                }
            ],
            "name":"搅磨"
        },
        {
            "children":[
                {
                    "name":"分离时长",
                    "value":"1.083"
                }
            ],
            "name":"固液分离"
        },
        {
            "children":[
                {
                    "name":"干燥时长",
                    "value":"0.5"
                },
                {
                    "name":"主机转速",
                    "value":"40"
                },
                {
                    "name":"主机温度",
                    "value":"68"
                },
                {
                    "name":"主机内压强",
                    "value":"-0.05"
                },
                {
                    "name":"氮气流量",
                    "value":"5"
                }
            ],
            "name":"干燥"
        },
        {
            "children":[
                {
                    "name":"300L 搅磨机 ",
                    "value":"0.12"
                },
                {
                    "name":"500L 搅磨机 ",
                    "value":"0.03"
                },
                {
                    "name":"离心机",
                    "value":"0.22"
                },
                {
                    "name":"耙式干燥机",
                    "value":"0.01"
                },
                {
                    "name":"振筛机",
                    "value":"0.21"
                },
                {
                    "name":"卧式球磨机",
                    "value":"0.11"
                },
                {
                    "name":"混料机",
                    "value":"0.22"
                },
                {
                    "name":"200L 搅磨机",
                    "value":"0.03"
                },
                {
                    "name":"真空抽滤机",
                    "value":"0.12"
                },
                {
                    "name":"真空回转干燥机",
                    "value":"0.44"
                }
            ],
            "name":"设备磨损度"
        },
        {
            "children":[
                {
                    "name":"300L 搅磨机 ",
                    "value":"西门子"
                },
                {
                    "name":"500L 搅磨机 ",
                    "value":"施耐德"
                },
                {
                    "name":"离心机",
                    "value":"中国重工"
                },
                {
                    "name":"耙式干燥机",
                    "value":"中国重工"
                },
                {
                    "name":"振筛机",
                    "value":"中国重工"
                },
                {
                    "name":"卧式球磨机",
                    "value":"中国重工"
                },
                {
                    "name":"混料机",
                    "value":"中国重工"
                },
                {
                    "name":"200L 搅磨机",
                    "value":"施耐德"
                },
                {
                    "name":"真空抽滤机",
                    "value":"中国重工"
                },
                {
                    "name":"真空回转干燥机",
                    "value":"西门子"
                }
            ],
            "name":"设备制造商"
        },
        {
            "children":[
                {
                    "name":"干燥操作人",
                    "value":"李刚"
                },
                {
                    "name":"干燥复核人",
                    "value":"匡洪波"
                },
                {
                    "name":"称料操作人",
                    "value":"匡洪波"
                },
                {
                    "name":"称料复核人",
                    "value":"朱肖涵"
                },
                {
                    "name":"搅磨操作人",
                    "value":"匡洪波"
                },
                {
                    "name":"搅磨复核人",
                    "value":"朱肖涵"
                },
                {
                    "name":"固液分离操作人",
                    "value":"李刚"
                },
                {
                    "name":"固液分离复核人",
                    "value":"匡洪波"
                }
            ],
            "name":"班组人员"
        }
    ]
}
阅读 1.8k
2 个回答
const generateTreeData = (arr) => {
  const topLevelNodeMap = new Map();
  const secondLevelNodeMap = new Map();
  const thirdLevelNodeMap = new Map();

  for (let i = 0; i < arr.length; ++i) {
    if (!topLevelNodeMap.has(arr[i].name)) {
      topLevelNodeMap.set(arr[i].name, {
        name: arr[i].name,
        children: []
      });
    }
    if (!secondLevelNodeMap.has(arr[i].name1)) {
      secondLevelNodeMap.set(arr[i].name1, {
        name: arr[i].name1,
        children: []
      });
    }
    if (!secondLevelNodeMap.has(arr[i].name2)) {
      thirdLevelNodeMap.set(arr[i].name2, {
        name: arr[i].name2,
        value: arr[i].value
      });
    }
  }

  const visitedSecondLevel = new Set();
  const visitedThirdLevel = new Set();

  for (let i = 0; i < arr.length; ++i) {
    const topLevelNode = topLevelNodeMap.get(arr[i].name);
    const secondLevelNode = secondLevelNodeMap.get(arr[i].name1);
    const thirdLevelNode = thirdLevelNodeMap.get(arr[i].name2);

    if (!visitedSecondLevel.has(secondLevelNode.name)) {
      topLevelNode.children.push(secondLevelNode);
      visitedSecondLevel.add(secondLevelNode.name);
    }

    if (!visitedThirdLevel.has(thirdLevelNode.name)) {
      secondLevelNode.children.push(thirdLevelNode);
      visitedThirdLevel.add(thirdLevelNode.name);
    }
  }

  return Array.from(topLevelNodeMap.values());
};

实现思路比较简单,基本上就是处理新一条数据时,先看原有的一级数据存在与否,不存在直接用该条数据构建三级树,存在再看二级是否存在,存在就直接插入三级数据,不存在构建二级和三级就行了。代码如下:

data.reduce((acc, cur) => {
  const { name, name1, name2, value } = cur

  if (acc.name === name) {
    const item = acc.children.find(item => item.name === name1)
    if (item) {
      item.children.push({ name: name2, value })
    } else {
      acc.children.push({
        name: name1,
        children: [{ name: name2, value }],
      })
    }
  } else {
    acc = {
      name,
      children: [
        {
          name: name1,
          children: [{ name: name2, value }],
        },
      ],
    }
  }

  return acc
}, {})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题