I have the following nested object:
var test = {'a': {'name': 'CO2', 'x': ['US', 'UK', 'China'], 'y': [1,2,3]},
'b': {'name': 'GHG', 'x': ['US', 'UK', 'China'], 'y': [4,5,6]}
};
I have to dynamically iterate and get the ideal result:
[{'country': 'US', 'CO2': 1, 'GHG': 4},
{'country': 'UK', 'CO2': 2, 'GHG': 5},
{'country': 'China', 'CO2': 3, 'GHG': 6}]
I have already asked but it was the thing with arrays and I can’t get how to work with objects.
I can iterate and get an array of 2 objects but it is not what I needed
var traces = [];
Object.keys(test).forEach(function(key) {
var keys = test[key].x;
var values = test[key].y;
var name = test[key].name;
var trace = keys.map((country, index) => ({
country,
[name]: values[index]
}));
traces.push(trace);
});
Advertisement
Answer
You could reduce the values of the test object. Add each country as a key to the accumulator object and the object needed in the output as its value. Loop through each country in x and update the accumulator.
const test={a:{name:"CO2",x:["US","UK","China"],y:[1,2,3]},b:{name:"GHG",x:["US","UK","China"],y:[4,5,6]}},
values = Object.values(test),
group = values.reduce((acc, { name, x, y }) => {
x.forEach((country, i) => {
acc[country] ||= { country }
acc[country][name] = y[i]
})
return acc
}, {}),
output = Object.values(group)
console.log(output)