From the service, I get a JSON object with key-value pairs, and I need to dynamically create objects from them, grouped by one column.
JSON is as follows:
[ { "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 convert 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.
I currently have a working solution for this, but I don't know if this is 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 script here: http://jsbin.com/ozizom/1/
Do you have a better solution for this?