Javascript 将具有数组值的对象放入树中

Javascript 将具有数组值的对象放入树中,javascript,json,tree,Javascript,Json,Tree,我有一个对象数组,其中每个对象都有一个值数组。数据结构并不理想,但这是我访问它的唯一方式。我正在尝试将这个结构转换为树结构,这样我就可以构建一个D3缩进的可折叠表 我试图修改以前找到的一些答案,但尚未成功。这里有一个链接,指向我一直在研究的当前JSFIDLE 这是一个小例子,说明了我是如何得到这些数据的 { "data": [ { "items": [ "All Other", "4C FOODS CORP" ],

我有一个对象数组,其中每个对象都有一个值数组。数据结构并不理想,但这是我访问它的唯一方式。我正在尝试将这个结构转换为树结构,这样我就可以构建一个D3缩进的可折叠表

我试图修改以前找到的一些答案,但尚未成功。这里有一个链接,指向我一直在研究的当前JSFIDLE

这是一个小例子,说明了我是如何得到这些数据的

{
  "data": [
    {
      "items": [
        "All Other",
        "4C FOODS CORP"
      ],
      "hints": {
        "index": 0
      }
    },
    {
      "items": [
        "All Other",
        "PBNA"
      ],
      "hints": {
        "index": 14
      }
    },
    {
      "items": [
        "All Other",
        "PRIVATE LABEL"
      ],
      "hints": {
        "index": 15
      }
    },
    {
      "items": [
        "Base Water",
        "CCNA"
      ],
      "hints": {
        "index": 18
      }
    },
    {
      "items": [
        "Base Water",
        "CRYSTAL GEYSER"
      ],
      "hints": {
        "index": 19
      }
    }
  ]
}
我需要代码以如下方式完成:

[
  {
    "Category": "All Other",
    "children": [
      {
        "name": "4C FOODS CORP"
      },
      {
        "name": "PBNA"
      },
      {
        "name": "PRIVATE LABEL"
      }
    ]
  },
  {
    "Category": "Base Water",
    "children": [
      {
        "name": "CCNA"
      },
      {
        "name": "CRYSTAL GEYSER"
      }
    ]
  }
]

一种解决方案是首先结合生成一个
对象
,用于按类别对元素进行分组,然后在第二步中对生成的对象
条目
使用,以获得所需的输出:

const输入={
“数据”:[
{“项目”:[“所有其他”,“4C食品公司”],“提示”:{“索引”:0},
{“项目”:[“所有其他”、“PBNA”],“提示”:{“索引”:14},
{“项目”:[“所有其他”、“专用标签”],“提示”:{“索引”:15},
{“项目”:[“基础水”、“CCNA”],“提示”:{“索引”:18},
{“项目”:[“基础水”、“水晶间歇泉”],“提示”:{“索引”:19}
]
};
//按类别分组。
让res=input.data.reduce((acc,{items:[cat,val]})=>
{
acc[cat]=acc[cat]| |[];
acc[cat].push({name:val});
返回acc;
}, {});
//生成所需的输出结构。
res=Object.entries(res.map)([k,v])=>({category:k,children:v}));
控制台日志(res)
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装器{max height:100%!important;top:0;}
一个解决方案是首先结合使用生成一个
对象
,用于按类别对元素进行分组,然后在第二步中对生成的对象
条目
使用以获得所需的输出:

const输入={
“数据”:[
{“项目”:[“所有其他”,“4C食品公司”],“提示”:{“索引”:0},
{“项目”:[“所有其他”、“PBNA”],“提示”:{“索引”:14},
{“项目”:[“所有其他”、“专用标签”],“提示”:{“索引”:15},
{“项目”:[“基础水”、“CCNA”],“提示”:{“索引”:18},
{“项目”:[“基础水”、“水晶间歇泉”],“提示”:{“索引”:19}
]
};
//按类别分组。
让res=input.data.reduce((acc,{items:[cat,val]})=>
{
acc[cat]=acc[cat]| |[];
acc[cat].push({name:val});
返回acc;
}, {});
//生成所需的输出结构。
res=Object.entries(res.map)([k,v])=>({category:k,children:v}));
控制台日志(res)
.as控制台{背景色:黑色!重要;颜色:石灰;}

.as控制台包装{max height:100%!important;top:0;}
它比树小,但更像是一个具有单个级别的分组。它比树小,但更像是一个具有单个级别的分组。