I am trying to merge JSON objects which have common values.
This is the original JSON:
{
"setA":[
{
"setId":"setA"
,"prodId":"A"
,"price":"5"
,"delivertCost":"1"
,"name":"Set_Prod01"
}
,{
"setId":"setA"
,"prodId":"B"
,"price":"5"
,"delivertCost":"1"
,"name":"Set_Prod01"
}
]
}
Since it has same setId
and name
, I want to make it like this:
{
"setA": {
"setId":"setA"
,"prodId":"A,B"
,"price":"5"
,"deliveryCost":3
,"name":"Set_Prod01"
}
}
To do this, I made this JavaScript code, but it looks terrible and more elements have attributes with if else
than needed.
function groupBy(coll, f) {
return coll.reduce(function(acc, x) {
var k = f(x);
acc[k] = (acc[k] || []).concat(x);
return acc;
}, {});
}
var test = {
items: [{
setId: 'setA', prodId: "A", price: '5', deliveryCost : '1', name: "Set_Prod01"
}, {
setId: 'setA', prodId: "B", price :'5', deliveryCost : '2', name: "Set_Prod01"
}]
};
console.log(JSON.stringify(test));
var result = groupBy(test.items, function(x){return x.setId});
//first grouping
console.log(JSON.stringify(result));
//begin spagetti code... T^T
var secondResult = {};
for(var key in result){
var secondObjForSet = {};
var setGroup = result[key];
for(var i = 0; i < setGroup.length; i++) {
var singleSetItem = setGroup[i];
for(var innerKey in singleSetItem){
if(innerKey == 'deliveryCost'){
secondObjForSet[innerKey] = (typeof secondObjForSet[innerKey] === 'undefined') ? 0 + singleSetItem[innerKey] : (secondObjForSet[innerKey] * 1) + (singleSetItem[innerKey] * 1);
}else if(innerKey == 'prodId'){
secondObjForSet[innerKey] =
(typeof secondObjForSet[innerKey] === 'undefined' || secondObjForSet[innerKey] == '') ?
singleSetItem[innerKey] : secondObjForSet[innerKey] + ',' + singleSetItem[innerKey];
}
else{
secondObjForSet[innerKey] = singleSetItem[innerKey];
}
}
}
secondResult[key] = secondObjForSet;
}
console.log(JSON.stringify(secondResult));
This is not flexible at all, so I need some help to make it more efficient.
deliveryCost
3 and not 2 (1 + 1)? How aboutprice
? Why isn't a sum? Not sure I understand what you need... \$\endgroup\$delivery cost
must summed up. andprodId
have to connected with comma, and remain others. The code I provided is working, but I think it is totally not efficient. \$\endgroup\$