Javascript-将嵌套对象转换为项目数组

Javascript-将嵌套对象转换为项目数组,javascript,javascript-objects,hierarchy,Javascript,Javascript Objects,Hierarchy,我有一个像这样的对象: [ { "id": 1, "name": "Electronics", "path": "Electronics", "children": [ { "id": 2, "name": "Laptops & PC", "path": "Electronics > Laptops & PC", "children": [] },

我有一个像这样的对象:

[
  {
    "id": 1,
    "name": "Electronics",
    "path": "Electronics",
    "children": [
      {
        "id": 2,
        "name": "Laptops & PC",
        "path": "Electronics > Laptops & PC",
        "children": []
      },
      {
        "id": 7,
        "name": "Phones & Accessories",
        "path": "Electronics > Phones & Accessories",
        "children": [
          {
            "id": 8,
            "name": "Smartphones",
            "path": "Electronics > Phones & Accessories > Smartphones",
            "children": [
              {
                "id": 9,
                "name": "Android",
                "path": "Electronics > Phones & Accessories > Smartphones > Android",
                "children": []
              },
              {
                "id": 10,
                "name": "iOS",
                "path": "Electronics > Phones & Accessories > Smartphones > iOS",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id": 11,
    "name": "Software",
    "path": "Software",
    "children": []
  }
]
[
  {header: 'Electronics'},
  {name: 'Laptops & PC', group: 'Electronics', id: 2},
  {name: 'Phones & Accessories', group: 'Electronics', id: 7},
  {name: 'Smartphones', group: 'Phones & Accessories', id: 8},
  {name: 'Android', group: 'Smartphones', id: 9},
  {name: 'iOS', group: 'Smartphones', id: 10},
  {divider: true},
  {name: 'Software', group: 'Software', id: 11}
]
我想把它转换成这样的东西:

[
  {
    "id": 1,
    "name": "Electronics",
    "path": "Electronics",
    "children": [
      {
        "id": 2,
        "name": "Laptops & PC",
        "path": "Electronics > Laptops & PC",
        "children": []
      },
      {
        "id": 7,
        "name": "Phones & Accessories",
        "path": "Electronics > Phones & Accessories",
        "children": [
          {
            "id": 8,
            "name": "Smartphones",
            "path": "Electronics > Phones & Accessories > Smartphones",
            "children": [
              {
                "id": 9,
                "name": "Android",
                "path": "Electronics > Phones & Accessories > Smartphones > Android",
                "children": []
              },
              {
                "id": 10,
                "name": "iOS",
                "path": "Electronics > Phones & Accessories > Smartphones > iOS",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id": 11,
    "name": "Software",
    "path": "Software",
    "children": []
  }
]
[
  {header: 'Electronics'},
  {name: 'Laptops & PC', group: 'Electronics', id: 2},
  {name: 'Phones & Accessories', group: 'Electronics', id: 7},
  {name: 'Smartphones', group: 'Phones & Accessories', id: 8},
  {name: 'Android', group: 'Smartphones', id: 9},
  {name: 'iOS', group: 'Smartphones', id: 10},
  {divider: true},
  {name: 'Software', group: 'Software', id: 11}
]
基本上

  • 如果根元素有子元素,则应将其转换为
    标题
  • 所有元素的父名称应为
    group
  • 当完成一个根元素时,它需要插入
    {divider:true}
    ,然后再继续下一个。(如果它是最后一个根元素,请不要插入
    {divider:true}
虽然我能够在stackoverflow上找到许多JSON分层解决方案,但我无法对这些解决方案进行反向工程


有人能帮我吗?

您可以采取迭代和递归的方法,通过检查头,保留相应的除法器和迭代子项

然后需要为任何项目添加标准对象

递归回调在组上使用闭包。如果未设置,则组是根项

函数getParts(数组){
var结果=[];
数组.forEach(函数iter(组){
返回函数({id,name,children},i,{length}){
if(!group&&children.length){
push({header:name});
}
if(组| |!子对象.长度){
push({name,group:group | | name,id});
}
forEach(iter(name));
如果(!group&&i+1!==长度){
push({divider:true});
}
};
}(''));
返回结果;
}
var数据=[{id:1,名称:“电子学”,路径:“电子学”,子项:[{id:2,名称:“笔记本电脑和PC”,路径:“电子学>笔记本电脑和PC”,子项:[},{id:7,名称:“手机和配件”,路径:“电子学>手机和配件”,子项:[{id:8,名称:“智能手机”,路径:“电子学>手机和配件>智能手机”,子项:[{id:9,名称:“安卓”,路径:“电子产品>手机及配件>智能手机>安卓”,儿童:[]},{id:10,名称:“iOS”,路径:“电子产品>手机及配件>智能手机>iOS”,儿童:[]}]},{id:11,名称:“软件”,路径:“软件”,路径:“软件”,儿童:[]},{id:11,名称:“软件”,路径:“软件”,子项:[]},
结果=获取零件(数据);
console.log(结果);

.as console wrapper{max height:100%!important;top:0;}
这是一种使用
数组的递归方法。reduce
和spread操作符(
)在数据移动时将列表展平,并使用一个单独的助手函数处理非标题:

const flatte=data=>
数据减少((a,e,i)=>{
if(如儿童长度){
a、 push({header:e.name});
a、 推(…压扁器(如儿童,如姓名));
}
否则{
a、 push({name:e.name,group:e.name,id:e.id});
}
如果(i
数据减少((a,e)=>{
a、 push({name:e.name,group:grp,id:e.id});
a、 推(…压扁器(如儿童,如姓名));
返回a;
}, [])
;
常数数据=[
{
“id”:1,
“名称”:“电子产品”,
“路径”:“电子”,
“儿童”:[
{
“id”:2,
“名称”:“笔记本电脑和PC”,
“路径”:“电子产品>笔记本电脑和PC”,
“儿童”:[]
},
{
“id”:7,
“名称”:“电话和配件”,
“路径”:“电子产品>手机和配件”,
“儿童”:[
{
“id”:8,
“名称”:“智能手机”,
“路径”:“电子产品>手机和配件>智能手机”,
“儿童”:[
{
“id”:9,
“名称”:“安卓”,
“路径”:“电子产品>手机和配件>智能手机>安卓”,
“儿童”:[]
},
{
“id”:10,
“名称”:“iOS”,
“路径”:“电子产品>手机和配件>智能手机>iOS”,
“儿童”:[]
}
]
}
]
}
]
},
{
“id”:11,
“名称”:“软件”,
“路径”:“软件”,
“儿童”:[]
}
];

log(展平(数据));
感谢您的努力!:)被接受为答案,因为比其他答案更快,更容易理解。嘿,如果有多个没有子项的根,你的代码不会添加分隔符。你能修复它吗?以下是示例:@NinaScolz它可以工作!谢谢!你能解释一下编辑方法吗?我删除了分隔符检查并添加了组检查(对于根项目为空)如果这个项目不是最后一个有索引和长度的项目,你能看到这个链接吗。。