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