JavaScript将数据分组到树视图2级

JavaScript将数据分组到树视图2级,javascript,typescript,Javascript,Typescript,我有一个JSON对象,如下所示: { id: '1', items: [ { id: '1', saleId: '123', saleIdAndItemId: '123456', locationId: '123', itemCode: '456', itemDescription: 'my item',

我有一个JSON对象,如下所示:

{
    id: '1', 
    items: [
        {
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        },
        {
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        }
    ]
},
{
    id: '2', 
    items: [
        {
            id: '2',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '556',
            categoryDescription: 'my category 6',
            qty: 10,
            saleValue: 200
        }
    ]
},
{
    id: '3', 
    items: [
        {
            venueId: '3',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '557',
            categoryDescription: 'my category 7',
            qty: 10,
            saleValue: 200
        }
    ]
};
{
    '1': { 
        '555': { 
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        }
    }
}
我想将其制作成一个新的JSON对象,其中所有内容都是按id分组的(它已经是了,但我需要数字作为键),然后按categoryCode分组,因此结果如下所示:

{
    id: '1', 
    items: [
        {
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        },
        {
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        }
    ]
},
{
    id: '2', 
    items: [
        {
            id: '2',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '556',
            categoryDescription: 'my category 6',
            qty: 10,
            saleValue: 200
        }
    ]
},
{
    id: '3', 
    items: [
        {
            venueId: '3',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '557',
            categoryDescription: 'my category 7',
            qty: 10,
            saleValue: 200
        }
    ]
};
{
    '1': { 
        '555': { 
            id: '1',
            saleId: '123',
            saleIdAndItemId: '123456',
            locationId: '123',
            itemCode: '456',
            itemDescription: 'my item',
            categoryCode: '555',
            categoryDescription: 'my category',
            qty: 10,
            saleValue: 200
        }
    }
}

有没有一种简单的方法可以使用lodash或纯JavaScript或某个NPM包来实现这一点?

我创建了一个通用函数,用于接收项目数组,并基于attrKeys和infoKeys数组对其进行解析:

const数据=[{
id:'1',
项目:[{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
}, {
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
}]
}, {
id:'2',
项目:[{
id:'2',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“556”,
类别说明:“我的类别6”,
数量:10,
销售价值:200
}]
}, {
id:'3',
项目:[{
维纽伊德:“3”,
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“557”,
类别说明:“我的类别7”,
数量:10,
销售价值:200
}]
}];
const transformData=(输入,属性键=[],信息键=[],深度=0)=>{
if(input&&typeof input==='object'&&input.length){
常量key1=属性键[deep];
const key2=信息键[deep];
deep++;
常量输出={}
input.forEach(i=>{
const info=i[key2]?转换数据(i[key2],属性键,信息键,深度):i;
输出[`${i[key1]}`]=info;
});
返回输出;
}
返回输入;
};
//你想要的在这里
const transformedData=transformData(数据,['id','categoryCode'],['items'])

console.log({transformedData})
遵循嵌套的
for…of
循环方法:

const数据=[{
id:'1',
项目:[{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
}, {
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
}]
}, {
id:'2',
项目:[{
id:'2',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“556”,
类别说明:“我的类别6”,
数量:10,
销售价值:200
}]
}, {
id:'3',
项目:[{
维纽伊德:“3”,
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“557”,
类别说明:“我的类别7”,
数量:10,
销售价值:200
}]
}];
设finalData={};
对于(让obj表示数据){
finalData[obj.id]={};
用于(对象项目的可变项目){
finalData[obj.id][item.categoryCode]={…item
};
}
}

console.log(finalData)您可以使用Array.reduce函数来实现它

const数组=[{
id:'1',
项目:[
{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
},
{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
}
]
},
{
id:'2',
项目:[
{
id:'2',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“556”,
类别说明:“我的类别6”,
数量:10,
销售价值:200
}
]
},
{
id:'3',
项目:[
{
id:'3',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“557”,
类别说明:“我的类别7”,
数量:10,
销售价值:200
}
]
}];
console.log(
大堆
//展平项目数组
.减少((上一个,当前)=>{
返回上一个concat(当前项目);
}, [])
.减少((上一个,当前)=>{
如果(!上一个[当前id])
上一个[当前id]={};
如果(!prev[curr.id][curr.categoryCode])
上一个[curr.id][curr.categoryCode]={};
上一个[curr.id][curr.categoryCode]=当前;
返回上一个;
}, {})

);或者,您可以使用reduce函数仅通过7行代码对其进行归档

const数组=[
{
id:'1',
项目:[
{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
locationId:'123',
项目代码:“456”,
itemDescription:'我的项目',
类别代码:“555”,
类别说明:“我的类别”,
数量:10,
销售价值:200
},
{
id:'1',
萨利德:“123”,
saleIdAndItemId:'123456',
洛卡特