2012-12-17 2 views
1

Je veux afficher la valeur d'une clé struct comme:Affichage Struct informations Coldfusion

#stReviewDetail['tags']['travelParty']['value']# 

Il est possible que tags, travelParty ou value manque. Quel est le meilleur moyen de vérifier si la hiérarchie de structure est disponible? Quelque chose comme:

<cfif StructKeyExists(stReviewDetail, 'tags') AND 
     StructKeyExists(stReviewDetail['tags'], 'travelParty') AND 
     StructKeyExists(stReviewDetail['tags']['travelParty'], 'value') > 
    .... 
</cfif> 

ou y a-t-il une meilleure façon de le faire?

+0

Vous êtes sur la bonne voie en utilisant StructKeyExists. Cependant, la vraie réponse dépend de ce que vous voulez afficher si certaines, mais pas toutes les clés sont présentes. Si vous ne le savez pas, les gens sur Stackoverflow sont les mauvais à demander. –

+1

C'est exactement l'approche que je prendrais aussi, avec les multiples StructKeyExists – duncan

+1

Comme l'a dit @DanBracuk, cela dépend de ce que vous voulez. Si vous pouvez vivre avec juste savoir si cela a fonctionné ou non, vous pourriez juste essayer de le référencer à partir d'un bloc try-catch. Si cela fonctionne, cool, sinon, faire quelque chose de sensible dans la capture. – Barry

Répondre

5

StructKeyExists multiples sont laids, et il est facile d'écrire une fonction pour simplifier:

Utilisation:

<cfif CheckNestedKeys(stReviewDetail,['tags','travelParty','value']) > 
    #stReviewDetail['tags']['travelParty']['value']# 
</cfif> 


code:

<cffunction name="CheckNestedKeys" returntype="Boolean" output=false> 
    <cfargument name="Struct" type="Struct" required /> 
    <cfargument name="Keys" type="Array" required /> 

    <cfset var CurStruct = Arguments.Struct /> 

    <cfloop index="local.CurKey" array=#Arguments.Keys# > 
     <cfif StructKeyExists(CurStruct,CurKey)> 
      <cfset CurStruct = CurStruct[CurKey] /> 
     <cfelse> 
      <cfreturn false /> 
     </cfif> 
    </cfloop> 

    <cfreturn true /> 

</cffunction> 
+0

Cela ne devrait-il pas être différent pour chaque test? Peut-être la dernière clé qui existait? – Travis

+0

La plupart du temps, je m'en fous - c'est juste un contrôle de sécurité - mais il est facile de le modifier pour retourner CurKey ou une chaîne vide, si c'est ce que vous vouliez. –

+0

Oh, sans doute aussi mentionner, dans Railo 4.1 Je pense que vous serez capable de faire: \t '#stReviewDetail ['tags'] ['travelparty'] ['value']?: 'Sortie si non défini' # ' –

2

Si vous connaître les touches spécifiques, vous pouvez simplement utiliser isDefined:

<cfif isDefined("stReviewDetail.tags.travelParty.value")> 
    <cfdump var="#stReviewDetail.tags#">  
</cfif> 
+0

isDefined est logiquement équivalent à StructKeyExists, mais plus lent. –

+2

un peu ... Cela vous donnerait la réponse mais c'est moins précis. Si vous avez variables.someVar et utilisez isDefined ("someVar") en pensant que vous cherchez form.someVar vous deviendrez vrai. structKeyExists est plus précis car vous devez définir votre structure/portée. En ce qui concerne la vitesse, le dernier test que j'ai vu était négligeable, mais seulement plus lent dans une condition fausse. – Travis

+2

Cela devrait également être 'isDefined (" stReviewDetail.tags.travelParty.value ")' J'ai essayé de le modifier mais les modifications ont été rejetées. – Travis

Questions connexes