Maison  >  Article  >  développement back-end  >  Implémentation de Golang utilisant JQ avec la condition "valeur dans la liste"

Implémentation de Golang utilisant JQ avec la condition "valeur dans la liste"

WBOY
WBOYavant
2024-02-08 23:30:11943parcourir

使用 JQ 的 Golang 实现时具有“列表中的值”条件

Ce que l'éditeur php Xiaoxin va introduire aujourd'hui, c'est la condition "valeur dans la liste" lors de l'utilisation de l'implémentation Golang de JQ. Dans Golang, JQ est un langage de requête puissant pour extraire et transformer des informations à partir de données JSON. La condition « valeur dans la liste » est une condition couramment utilisée dans les requêtes JQ. Elle peut être utilisée pour filtrer les éléments de la liste qui contiennent des valeurs spécifiées. En utilisant l'implémentation Golang de JQ, nous pouvons facilement implémenter cette fonction, simplifiant ainsi notre traitement des données JSON et améliorant l'efficacité du développement. Ensuite, nous détaillerons comment implémenter la condition « valeur dans la liste » à l'aide de l'implémentation Golang de JQ.

Contenu de la question

J'utilise cette bibliothèque dans mon application Go : https://github.com/itchyny/gojq Cela fonctionne bien, mais je ne trouve pas comment faire quelque chose dans la documentation JQ. J'ai une requête jq dont l'entrée est la liste des magasins disponibles à partir du fichier de configuration comme ceci :

( [.stores[] | select( .is_open == true )] | length  > 1 ) 
     and 
( [.stores[] | select( .name == "Some store" )] | length == 1 )

En gros, cela signifie que, dans la liste des magasins disponibles dans ma région, au moins un est ouvert et, dans la liste des magasins disponibles dans ma région, au moins un s'appelle « un magasin ». (Notez qu'il s'agit de deux conditions distinctes, je m'en fiche si "Un magasin" est fermé).

Maintenant, je dois modifier cette condition afin que chaque magasin ait un "type_identifier" qui est une chaîne au lieu d'utiliser la deuxième condition pour voir le nom. En gros, ce que je veux, c'est quelque chose comme ça :

( [.stores[] | select( .type_identifier in ["type1","type2", "type2"...] )] | length == 1 )

La liste des types disponibles compte environ 600 types différents. Ma question est donc :

  1. Y a-t-il un sélecteur « in » dans JQ ? Quelle est la syntaxe correcte ?
  2. La liste des « types » disponibles est un autre champ du même objet, avec la liste des magasins, comment puis-je lire la liste directement depuis cette propriété ?

Merci d'avance

Solution de contournement

Si la liste est si longue, il est préférable de créer une table de recherche.

(
   [ "type1", "type2", "type3" ] |
   map( { (.): true } ) |
   add
) as $lkup |

.stores |
( map( select( .is_open ) ) | length > 1 )
   and
( map( select( $lkup[ .type_identifier ] ) ) | length == 1 )

J'ai mis les communs .stores 分解出来,替换成了 [ .[] | ... ]map( ... ).

Démo sur jqplay.

Vous pouvez également utiliser INDEX.

(
   [ "type1", "type2", "type3" ] |
   INDEX( .[]; . )
) as $lkup |

.stores |
( map( select( .is_open ) ) | length > 1 )
   and
( map( select( $lkup[ .type_identifier ] ) ) | length == 1 )

Démo sur jqplay.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer