Javascript 转换js对象
我正在尝试变换此对象:Javascript 转换js对象,javascript,data-conversion,Javascript,Data Conversion,我正在尝试变换此对象: [ { "keyword":"apple", "category_1":"object", "category_2":"living", "category_3":"fruit", "count":5 }, { "keyword":"orange", "category_1":"object", "category_2":
[
{
"keyword":"apple",
"category_1":"object",
"category_2":"living",
"category_3":"fruit",
"count":5
},
{
"keyword":"orange",
"category_1":"object",
"category_2":"living",
"category_3":"fruit",
"count":1
},
{
"keyword":"table",
"category_1":"object",
"category_2":"non living",
"category_3":"house item",
"count":3
},
{
"keyword":"cat",
"category_1":"object",
"category_2":"living",
"category_3":"animal",
"count":4
},
{
"keyword":"stadium",
"category_1":"place",
"category_2":"sport related",
"category_3":"indoor",
"count":2
}
]
变成这样一个物体:
[
{
label: 'object',
count: 9,
childs: [
{
label: 'living',
count: 6,
childs: [
{
label: 'fruit',
count: 6,
childs: [
{
keyword: 'apple',
count: 5,
},
{
keyword: 'orange',
count: 1,
}
]
}
]
},
{
label: 'non living',
count: 3,
childs: [
{
label: 'animal',
count: 3,
childs: [
{
keyword: 'cat',
count: 3,
}
]
}
]
}
]
},
{
label: 'place',
count: 2,
childs: [
{
label: 'sport related',
count: 2,
childs: [
{
label: 'indoor',
count: 2,
childs: [
{
keyword: 'stadium',
count: 2,
}
]
}
]
}
]
}
]
我试着以递归的方式使用Array.reduce,但递归性有问题,我总是遇到麻烦。
如您所见,关键是将数组转换为按类别对其元素进行分组的嵌套对象(计数部分不是必需的)
如果任何人对此有任何后见之明,您可以首先将数据转换为嵌套地图,每个地图都由相关类别键入。这允许快速识别要注入下一个对象的正确分支 然后对其应用递归函数,将基于映射的树转换为目标结构,同时增加计数 代码:
函数生成树(数据){
//使用嵌套贴图创建树,按类别设置关键帧
让main=新地图;
对于(数据的let{关键字,类别_1,类别_2,类别_3,计数}){
设obj={关键字,计数};
设map=main;
对于(让[类别1、类别2、类别3]的类别){
let child=map.get(cat);
如果(!child)map.set(cat,child=newmap);
map=儿童;
}
let child=map.get(关键字);
if(!child)map.set(关键字,child={关键字,计数:0});
child.count+=计数;
}
//递归函数将嵌套映射转换为目标结构
函数转换(数据){
让parentCount=0;
让arr=Array.from(数据,([label,value])=>{
让我们数一数,孩子们;
if(映射的值实例){
([children,count]=转换(值));
值={label,count,children};
}否则{
({count}=value);
}
parentCount+=计数;
返回值;
});
返回[arr,parentCount];
}
返回变换(main)[0];
}
//运行示例:
让数据=[{“关键字”:“苹果”,“类别1”:“对象”,“类别2”:“生活”,“类别3”:“水果”,“计数”:5},{“关键字”:“橙色”,“类别1”:“对象”,“类别2”:“生活”,“类别3”:“水果”,“计数”:1},{“关键字”:“表格”,“类别1”:“对象”,“类别2”:“非生活”,“类别3},{“房屋项目”,“计数”:3},{“关键字”:“猫”,“类别1”:“对象”,“类别2”:“生活”,“类别3”:“动物”,“计数”:4},{“关键字”:“体育场”,“类别1”:“场地”,“类别2”:“体育相关”,“类别3”:“室内”,“计数”:2}];
console.log(makeTree(data));
为什么不使用childs
而不是childs
?对象计数不应该是13吗?还缺少一个cat和三个表;P