微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将对象数组转换为分层数据结构

如何解决将对象数组转换为分层数据结构

我有一个原始数组,我想在需要分层数据结构的 Sunburst 地图中绘制它。

[
{id: "Asia,India,NewDelhi",value: 41},{id: "Europe,Germany,Berlin",value: 24},England,London",value: 3},{id: "northAmerica,USA,NewYork",value: 4},Boston",chicago",{id: "Austrailia,Sydney",{id: "Asia,China,Beijing",value: 2},]

想要的结果

[
  {
   id: Asia,children:[{
     id: India,children:[{
       id: Delhi,value: 41,}]
     },{
      id:China,children:[{
        id: Beijing
        value: 2,}]
     }]
  },{
    id: Europe,children: [{
       id: Germany,children: [{
          id: Berlin,value: 24,}]
    },{
       id: England,children: [{
         id: London,value: 3,}]
    }]
  },{
   id: northAmerica,children:[{
      id: USA,children:[{
        id: NewYork,value: 4,},{
        id: Boston,{
        id: Chicago,}]
   }]
  },{
   id: Austrailia
   children: [{
     id:Sydney,}]
  },]

谁能帮我解决这个问题,我试过使用 reduce 方法,但我无法得到想要的结果。

PS:如果有人能提出一个答案来处理用逗号分隔的 n 个 id,那将非常有用。例如:这里我们有 3 个用逗号分隔的 id 层次结构,如果有 4 或 5 个深度数据会发生什么。

解决方法

一个简单的递归解决方案:

const data = [
  {id: "Asia,India,NewDelhi",value: 41},{id: "Europe,Germany,Berlin",value: 24},England,London",value: 3},{id: "NorthAmerica,USA,NewYork",value: 4},Boston",Chicago",{id: "Austrailia,Sydney",{id: "Asia,China,Beijing",value: 2},];

const addChild = (ids,value,arr) => {
  const id = ids.shift();
  let index = arr.findIndex(item => item.id === id);
  if (index < 0) {
    arr.push({id,children: []});
    index = arr.length - 1;
  }
  if (ids.length > 0) {
    const children = arr[index].children;
    addChild(ids,children);
  }
  else
    arr[index].value = value;
}

const treeData = data.reduce((tree,item) => {
  const ids = item.id.split(',');
  addChild(ids,item.value,tree);
  return tree;
},[]);

console.log(treeData);

,

从您的输入构建对象的层次结构相当简单,您甚至不需要做任何递归循环 + reduce 就可以做到。这将适用于逗号分隔列表中的任意数量的级别。

const input = [
{id: "Asia,chicago",value: 2}
]
const result = input.map(o => ({ids:o.id.split(","),value:o.value})).reduce( (acc,obj) => {
   let curr = acc;
   let id;
   while( (id = obj.ids.shift()) != null ){
     if(!curr[id])
        curr[id] = {};
        
     curr = curr[id];
   }
   curr.value = obj.value
   return acc;
},{});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

然后将其转换为您想要的格式确实需要一些递归:

const input = [
{id: "Asia,{});

function buildHierarchy(input){
  return Object.entries(input).map( ([id,children]) => {
    if(children.value){
      return {id,value:children.value}
    }
    return {id,children: buildHierarchy(children)}
  })
}

console.log(buildHierarchy(result));
.as-console-wrapper { max-height: 100% !important; top: 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。