2017-09-18 2 views
0

J'ai un tableau JSON qui contient beaucoup d'objets et il ressemble à ceci:JQ: Ajouter des valeurs d'une clé spécifique pour tous les objets avec la même ID

[ 
{"ID":"A","VALUE":12,"TYPE":"single"}, 
{"ID":"A","VALUE":17,"TYPE":"single"}, 
{"ID":"A","VALUE":-7,"TYPE":"single"}, 

{"ID":"B","VALUE":35,"TYPE":"single"}, 
{"ID":"B","VALUE":10,"TYPE":"single"}, 
{"ID":"B","VALUE":15,"TYPE":"single"}, 

{"ID":"C","VALUE":0,"TYPE":"single"}, 
{"ID":"C","VALUE":13,"TYPE":"single"}, 
{"ID":"C","VALUE":20.5,"TYPE":"single"} 
] 

Maintenant, je voudrais ajouter toutes les valeurs pour chaque ID et créer de nouveaux objets avec les résultats comme ceci:

{"ID":"A","VALUE":22,"TYPE":"total"}, 
{"ID":"B","VALUE":60,"TYPE":"total"}, 
{"ID":"C","VALUE":23.5,"TYPE":"total"} 

De plus, les objets résultants doivent être ajoutés au tableau initial. Je suis assez nouveau à jq alors j'ai fait quelques recherches. En effet, je sais comment obtenir les totaux pour un ID:

[.[] | select(."ID"=="A").VALUE]|add 

-> 22 

et comment créer de nouveaux objets:

.[] | {ID: .ID, VALUE: .VALUE, TYPE: "total"} 

Mais comment puis-je obtenir le format que je veux partir d'ici? Avec une boucle?

Merci!

Répondre

2

Voici une solution qui utilise reduce pour calculer les totaux, générer des objets dans le format spécifié et les ajouter au tableau d'entrée d'origine:

. + [ 
    reduce .[] as $r ({}; .[$r["ID"]] += $r["VALUE"]) 
    | keys[] as $id 
    | {ID:$id, VALUE:.[$id], TYPE:"total"} 
] 

Notez que la valeur de cette calcule avec les données d'échantillon pour C est 33.5 qui je crois est correct.

+0

Merci! Cela fonctionne, et oui, il devrait être 33,5 :) – user2556342

2

Vous pouvez les regrouper par ID, puis les agréger dans les nouveaux objets. Puis combinez cela avec le tableau existant d'éléments.

[.[], (group_by(.ID)[] | { ID: .[0].ID, VALUE: map(.VALUE)|add, TYPE: "total" })] 
+0

Cela fonctionne aussi bien! Je vous remercie! – user2556342