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