for example, from this:
const items = [
{
"id": 3,
"orgId": 2,
"mod": "toyota",
"part": "wheel",
"price": 333
},
{
"id": 4,
"orgId": 2,
"mod": "toyota",
"part": "shell",
"price": 350
},
{
"id": 9,
"orgId": 2,
"mod": "honda",
"part": "wheel",
"price": 222
},
{
"id": 10,
"orgId": 2,
"mod": "honda",
"part": "shell",
"price": 250
}
]
and convert to:
items = {
"toyota": {"wheel": 333, "shell": 350 },
"honda": {"wheel": 222, "shell": 250 }
}
What is the most elegant way?
I was trying to use .map() but I'm not sure how to complete the nested struture.
Follow up:
Using this method:
const structure = {};
prices.forEach((e) => {
structure[e.mod] ??= {};
structure[e.mod][e.part] = e.price;
});
or:
result = items.reduce((r, o) => {
r[o.mod] ??= {};
r[o.mod][o.part] = o.price;
return r;
},{});
I got the following error:
Module parse failed: Unexpected token (56:31)
File was processed with these loaders:
* ./node_modules/@pmmmwh/react-refresh-webpack-plugin/loader/index.js
* ./node_modules/react-scripts/node_modules/babel-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
| const structure = {};
| prices.forEach(e => {
> structure[e.mod] ??= {};
| structure[e.mod][e.part] = e.price;
| });
I have done quite a lot searching but cannot find how to solve it.
Any advices?
You can use array#reduce to group based on mod.
const items = [ { "id": 3, "orgId": 2, "mod": "toyota", "part": "wheel", "price": 333 }, { "id": 4, "orgId": 2, "mod": "toyota", "part": "shell", "price": 350 }, { "id": 9, "orgId": 2, "mod": "honda", "part": "wheel", "price": 222 }, { "id": 10, "orgId": 2, "mod": "honda", "part": "shell", "price": 250 } ],
result = items.reduce((r, o) => {
r[o.mod] ??= {};
r[o.mod][o.part] = o.price;
return r;
},{});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
You could use the code below:
const transformedItems = items.reduce((acc, item) => {
acc[item.mod] = { ...acc[item.mod], [item.part]: item.price }
return acc
}, {})
console.log(transformedItems)
You could also iterate through items and populate the result object as below:
const items = [ { "id": 3, "orgId": 2, "mod": "toyota", "part": "wheel", "price": 333 }, { "id": 4, "orgId": 2, "mod": "toyota", "part": "shell", "price": 350 }, { "id": 9, "orgId": 2, "mod": "honda", "part": "wheel", "price": 222 }, { "id": 10, "orgId": 2, "mod": "honda", "part": "shell", "price": 250 } ];
const result = {};
items.forEach((e) => {
result[e.mod] = {...result[e.mod], [e.part]: e.price};
});
console.log(result);