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
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
Vous devez vous connecter pour publier un commentaire.
En supposant que le JSON dossiers seront toujours classés par Groupe, voici une autre approche:
Ici est un exemple de travail.
Trouvé un problème, cependant. Votre solution ne fonctionne correctement que si les groupes arrivent dans l'ordre (AAABBBCCC). par exemple, si la commande est AAABBCCCB, 4 dossiers sont créés: jsfiddle.net/GrmZF/2
Ouais, je le savais, c'est pourquoi je vous ai demandé si les dossiers toujours par triés par Groupe...
OriginalL'auteur sp00m
Voici une solution où le code de la taille est réduite (pour le meilleur ou pour le pire 🙂 par l'utilisation de JavaScript idiomes. Cette solution ne dépend pas de l'ordre des valeurs d'entrée:
Un exemple de travail est à http://jsfiddle.net/arQww.
Voici la solution la plus rapide que je peux trouver, ce qui suppose que les valeurs seront toujours triés par Groupe:
Une comparaison des performances est à http://jsperf.com/vnmzc. Alors que cette seconde solutions est plus rapide, les performances des deux est en O(n) et le monde réel différence entre eux sera sans conséquence, de sorte que la première solution est sans doute préférable, car c'est plus simple et plus général.
OriginalL'auteur dharcourt
Si vous devez manipuler des données beaucoup je recommande trait de soulignement cadre.
C'est la façon dont la solution sera de rechercher dans:
OriginalL'auteur Ivan Klass
J'ai besoin d'aide avec un problème similaire, acheter, je veux de la somme des valeurs. J'ai ce tableau avec des objets
et je tiens à l'utilisateur de choisir quel mois de la somme d'une option de menu.
Donc, Si l'utilisateur sélectionne
August 2014
dans le menu sélection, je veux de la somme de tous lesValueOneToSum
valeurs etValueTwoToSum
valeurs basées surAug2014
, comment pourrais-je le faire?Par exemple: la
totalSumOne
pourAug2014
serait168
ettotalSumTwo
serait55
.OriginalL'auteur user3771408