I have data as follows:
const results = [
{ make: "audi", fuel: "gasoline", model: "a1", count: 8 },
{ make: "audi", fuel: "diesel", model: "a3", count: 2 },
{ make: "audi", fuel: "gasoline", model: "a3", count: 5 }
];
And I want to map it to get the combinations of all keys with sum of count. Thus I want to get something as follows:
const mappedResults = [
{ make: "audi", fuel: undefined, model: undefined, count: 8 + 2 + 5 },
{ make: "audi", fuel: "diesel", model: undefined, count: 2 },
{ make: "audi", fuel: "gasoline", model: undefined, count: 8 + 5 },
{ make: "audi", fuel: "gasoline", model: "a1", count: 8 },
{ make: "audi", fuel: "diesel", model: "a3", count: 2 },
{ make: "audi", fuel: "gasoline", model: "a3", count: 5 },
{ make: "audi", fuel: undefined, model: "a1", count: 8 },
{ make: "audi", fuel: undefined, model: "a3", count: 2 + 5 },
{ make: undefined, fuel: undefined, model: "a1", count: 8 },
{ make: undefined, fuel: undefined, model: "a3", count: 2 + 5 },
{ make: undefined, fuel: "gasoline", model: "a1", count: 8 },
{ make: undefined, fuel: "diesel", model: "a3", count: 2 },
{ make: undefined, fuel: "gasoline", model: "a3", count: 5 },
{ make: undefined, fuel: "gasoline", model: undefined, count: 8 + 5 },
{ make: undefined, fuel: "diesel", model: undefined, count: 2 }
];
I 'm really not sure how to start.
Any help would be appreciated.
UPDATE
I ended up doing something as follows:
const groupedByMake = groupBy(results, "make");
const groupedByModel = groupBy(results, "model");
const groupedByFuel = groupBy(results, "fuel");
let groupedByMakeModel = {}
results.reduce(function (r, o) {
var key = o.make + "-" + o.model;
if (!groupedByMakeModel[key]) {
groupedByMakeModel[key] = Object.assign({}, o); // create a copy of o
r.push(groupedByMakeModel[key]);
} else {
groupedByMakeModel[key].count += o.count;
}
return r;
}, []);
let groupedByMakeFuel = {}
results.reduce(function (r, o) {
var key = o.make + "-" + o.fuel;
if (!groupedByMakeFuel[key]) {
groupedByMakeFuel[key] = Object.assign({}, o); // create a copy of o
r.push(groupedByMakeFuel[key]);
} else {
groupedByMakeFuel[key].count += o.count;
}
return r;
}, []);
let groupedByModelFuel = {}
results.reduce(function (r, o) {
var key = o.model + "-" + o.fuel;
if (!groupedByModelFuel[key]) {
groupedByModelFuel[key] = Object.assign({}, o); // create a copy of o
r.push(groupedByModelFuel[key]);
} else {
groupedByModelFuel[key].count += o.count;
}
return r;
}, []);
let groupedByMakeModelFuel = {}
results.reduce(function (r, o) {
var key = o.make + "-" + o.model + "-" + o.fuel;
if (!groupedByMakeModelFuel[key]) {
groupedByMakeModelFuel[key] = Object.assign({}, o); // create a copy of o
r.push(groupedByMakeModelFuel[key]);
} else {
groupedByMakeModelFuel[key].count += o.count;
}
return r;
}, []);
const result = []
each(keys(groupedByMake), key => {
return result.push({
make: key,
model: undefined,
fuel: undefined,
count: sumBy(groupedByMake[key], 'count')
})
})
each(keys(groupedByModel), key => {
return result.push({
make: undefined,
model: key,
fuel: undefined,
count: sumBy(groupedByModel[key], 'count')
})
})
each(keys(groupedByFuel), key => {
return result.push({
make: undefined,
model: undefined,
fuel: key,
count: sumBy(groupedByFuel[key], 'count')
})
})
each(keys(groupedByMakeModel), key => {
return result.push({
make: groupedByMakeModel[key]?.make,
model: groupedByMakeModel[key]?.model,
fuel: undefined,
count: groupedByMakeModel[key]?.count
})
})
each(keys(groupedByMakeFuel), key => {
return result.push({
make: groupedByMakeFuel[key]?.make,
model: undefined,
fuel: groupedByMakeFuel[key]?.fuel,
count: groupedByMakeFuel[key]?.count
})
})
each(keys(groupedByModelFuel), key => {
return result.push({
make: undefined,
model: groupedByModelFuel[key]?.model,
fuel: groupedByModelFuel[key]?.fuel,
count: groupedByModelFuel[key]?.count
})
})
each(keys(groupedByMakeModelFuel), key => {
return result.push({
make: groupedByMakeModelFuel[key]?.make,
model: groupedByMakeModelFuel[key]?.model,
fuel: groupedByMakeModelFuel[key]?.fuel,
count: groupedByMakeModelFuel[key]?.count
})
})
console.log("result: ", result)
But is there a better or faster way?