I need some advice on the proper way to attain my goal of applying group by and sum on JSON data.
Some server-side code actually generates a JSON that I have to work with :
[
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0003"
},
"printingMaterialCode": "400000033",
"printingQuantity": 400,
"approved": true
},
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0002"
},
"printingMaterialCode": "400000033",
"printingQuantity": 600,
"campaignId": "DATAS00002",
},
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0001"
},
"printingMaterialCode": "400000034",
"printingQuantity": 300,
"campaignId": "DATAS00002",
}
]
Now, I need to apply some operation (maybe groupby and sum) to get the below result :
[
{
"printingMaterialCode": "400000033",
"printingQuantity": 1000
"approvedQuantity": 400
},
{
"printingMaterialCode": "400000034",
"printingQuantity": 300,
}
]
Basically, the output is printingQuantity and approvedQuantity SUM per printingMaterialCode.
>Solution :
const myData = [
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0003"
},
"printingMaterialCode": "400000033",
"printingQuantity": 400,
"approved": true
},
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0002"
},
"printingMaterialCode": "400000033",
"printingQuantity": 600,
"campaignId": "DATAS00002",
},
{
"siteDetails": {
"printerCode": "660103684",
"siteId": "UTT212303-STB-2040-0001"
},
"printingMaterialCode": "400000034",
"printingQuantity": 300,
"campaignId": "DATAS00002",
}
]
function elaborateMyData(myData) {
const approvedQuantity = {};
const printingQuantity = {};
const myOutput = [];
myData.forEach((v) => {
printingQuantity[v.printingMaterialCode] = printingQuantity[v.printingMaterialCode] || 0;
approvedQuantity[v.printingMaterialCode] = approvedQuantity[v.printingMaterialCode] || 0;
printingQuantity[v.printingMaterialCode] += v.printingQuantity;
if (v.approved) {
approvedQuantity[v.printingMaterialCode] += v.printingQuantity
}
})
Object.keys(printingQuantity).forEach((v) => {
myOutput.push({
printingMaterialCode: v,
printingQuantity: printingQuantity[v],
approvedQuantity: approvedQuantity[v],
})
})
return myOutput
}
console.log(elaborateMyData(myData))