La création d'un tableau d'objets de paires clé-valeur

À partir d'un service que je reçois un objet JSON avec des paires clé-valeur, et j'ai besoin de créer dynamiquement des objets à partir d'eux, regroupés en une seule colonne.

Le JSON ressemble à ceci:

[
    { "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" }
]

J'aurais besoin de transformer le tableau d'objets suivant:

[
    { Group : "A", Name : "John", Age : 30, City : "London" },
    { Group : "B", Name : "Hans", Age : 35, City : "Berlin" },
    { Group : "C", Name : "José", Age : 25, City : "Madrid" }
]

Chaque groupe peut contenir un nombre quelconque de paires clé-valeur.

Actuellement, j'ai une solution qui fonctionne, mais je ne sais pas si c'est 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]);
}
}

Vous pouvez vérifier le violon ici: http://jsbin.com/ozizom/1/

Avez-vous une meilleure solution pour cela?

Sera le JSON être toujours triés par Groupe, comme dans votre exemple?
Oui, JSON champs de Groupe, la Clé et la Valeur sont donnés, et les enregistrements seront toujours triés par Groupe

OriginalL'auteur tpolyak | 2012-09-06