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}
有人能帮我吗?您可以采取迭代和递归的方法,通过检查头,保留相应的除法器和迭代子项 然后需要为任何项目添加标准对象 递归回调在组上使用闭包。如果未设置,则组是根项
函数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它可以工作!谢谢!你能解释一下编辑方法吗?我删除了分隔符检查并添加了组检查(对于根项目为空)如果这个项目不是最后一个有索引和长度的项目,你能看到这个链接吗。。