From a service I receive a JSON object with key-value pairs, and I need to dynamically create objects from them, grouped by one column.
The JSON looks like this:
[
{ "Group" : "A", "Key" : "Name", "Value" : "John" },
{ "Group" : "A", "Key" : "Age", "Value" : "30" },
{ "Group" : "A", "Key" : "City", "Value" : "London" },
{ "Group" : "B", "Key" : "Name", "Value" : "Hans" },
{ "Group" : "B", "Key" : "Age", "Value" : "35" },
{ "Group" : "B", "Key" : "City", "Value" : "Berlin" },
{ "Group" : "C", "Key" : "Name", "Value" : "José" },
{ "Group" : "C", "Key" : "Age", "Value" : "25" },
{ "Group" : "C", "Key" : "City", "Value" : "Madrid" }
]
I would need to transform it to the following array of objects:
[
{ Group : "A", Name : "John", Age : 30, City : "London" },
{ Group : "B", Name : "Hans", Age : 35, City : "Berlin" },
{ Group : "C", Name : "José", Age : 25, City : "Madrid" }
]
Each group can contain any number of key-value pairs.
Currently I have a working solution for this, but I don't know if it's optimal:
var items = [
{ "Group" : "A", "Key" : "Name", "Value" : "John" },
{ "Group" : "A", "Key" : "Age", "Value" : "30" },
{ "Group" : "A", "Key" : "City", "Value" : "London" },
{ "Group" : "B", "Key" : "Name", "Value" : "Hans" },
{ "Group" : "B", "Key" : "Age", "Value" : "35" },
{ "Group" : "B", "Key" : "City", "Value" : "Berlin" },
{ "Group" : "C", "Key" : "Name", "Value" : "José" },
{ "Group" : "C", "Key" : "Age", "Value" : "25" },
{ "Group" : "C", "Key" : "City", "Value" : "Madrid" }
], item, record, hash = {}, results = [];
// Create a "hash" object to build up
for (var i = 0, len = items.length; i < len; i += 1) {
item = items[i];
if (!hash[item.Group]) {
hash[item.Group] = {
Group : item.Group
};
}
hash[item.Group][item.Key] = item.Value;
}
// Push each item in the hash to the array
for (record in hash) {
if(hash.hasOwnProperty(record)) {
results.push(hash[record]);
}
}
You can check the fiddle here: http://jsbin.com/ozizom/1/
Do you have a better solution for this?
Assuming that the JSON records will always be sorted by Group, here is another approach:
var json = [
{ "Group" : "A", "Key" : "Name", "Value" : "John" },
{ "Group" : "A", "Key" : "Age", "Value" : "30" },
{ "Group" : "A", "Key" : "City", "Value" : "London" },
{ "Group" : "B", "Key" : "Name", "Value" : "Hans" },
{ "Group" : "B", "Key" : "Age", "Value" : "35" },
{ "Group" : "B", "Key" : "City", "Value" : "Berlin" },
{ "Group" : "C", "Key" : "Name", "Value" : "José" },
{ "Group" : "C", "Key" : "Age", "Value" : "25" },
{ "Group" : "C", "Key" : "City", "Value" : "Madrid" }
];
var array = [];
var previousGroup = null;
for(var i=0; i<json.length; i++) {
var group = json[i].Group;
if(previousGroup != group) {
array.push({Group: group});
previousGroup = group;
}
array[array.length-1][json[i].Key] = json[i].Value;
}
Here is a working example.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With