2015-12-14 1 views
1

J'ai cet objet, je dois évaluer ce qui est « moins cher » avec jmespathtrouver min et max par deux paramètres avec jmespath

{ 
    "wines": [ 
    { 
     "name": "b", 
     "price1": 30, 
     "price2": 110 
    }, 
    { 
     "name": "a", 
     "price1": 50, 
     "price2": 1 
    }, 
    { 
     "name": "c", 
     "price1": 40, 
     "price2": 1130 
    } 
    ] 
} 

la sortie doit être: « a » objet

je suis faire:

min_by(wines, &price1, &price2).name 
min_by(wines, &price1).name 
min_by(wines, sum(&price1, &price2)).name 

mais pas de chance

+0

'wines' est un paire clé/valeur dans un objet, ce ne serait donc pas 'min_by (obj.wines, & price1, & price2) .name' (si votre objet s'appelle' obj'). Je ne suis pas familier avec jmespath donc c'est une supposition. – Andy

+0

non, c'est juste un exemple que vous avez raison, le problème est dans le calcul d'une somme @Andy –

+0

Pouvez-vous préciser comment vous calculez le moins cher? Est-ce l'article qui a la plus faible valeur de 'price1' et' price2'? Ou est celui qui a la plus faible valeur de «price1 + price2»? – jamesls

Répondre

1

Selon ce que vous entendez par moins cher, si vous voulez choisir l'élément a la valeur minimale de price1 et Prix2 combinés, vous pouvez utiliser: min_by(wines, &sum([price1,price2])):

$ echo '{ 
    "wines": [ 
    { 
     "name": "b", 
     "price1": 30, 
     "price2": 110 
    }, 
    { 
     "name": "a", 
     "price1": 50, 
     "price2": 1 
    }, 
    { 
     "name": "c", 
     "price1": 40, 
     "price2": 1130 
    } 
    ] 
}' | jp 'min_by(wines, &sum([price1,price2]))' 

{ 
    "price2": 1, 
    "price1": 50, 
    "name": "a" 
} 

Les & doit être au début du deuxième argument parce que le type attendu est une référence d'expression. Le &sum([price1,price2]) indique que pour chaque élément dans le tableau wines, évaluez l'expression sum([price1,price2]) et utilisez la valeur résultante pour déterminer quel élément dans le tableau est le minimum.

Autre exemple, si vous voulez sélectionner l'élément dans la liste des vins qui a le prix le plus bas de soitprice1 ou price2, vous pouvez remplacer sum avec min:

$ echo '{ 
    "wines": [ 
    { 
     "name": "b", 
     "price1": 30, 
     "price2": 110 
    }, 
    { 
     "name": "a", 
     "price1": 50, 
     "price2": 1 
    }, 
    { 
     "name": "c", 
     "price1": 40, 
     "price2": 1130 
    } 
    ] 
}' | jp 'min_by(wines, &min([price1,price2]))' 

{ 
    "price2": 1, 
    "price1": 50, 
    "name": "a" 
} 
+0

oh - vous l'auteur de jmespath pour le noeud? @jamesls –

+0

merci pour la réponse –

+0

mais puis-je l'utiliser dans nodejs? je veux dire une telle expression: CHEAPEST_ONLINE = "min_by (context.wines, & sum ([prix1, prix2]))" –