2013-02-19 4 views
3

J'ai une structure imbriquée comme struct1.struct2.foo. Je voudrais vérifier si foo existe. Cependant, struct2 n'est pas garanti d'exister non plus. Je déteste utiliser isDefined(), mais je pense aussi que l'appel deux fois structKeyExists() est inutile (par exemple, if (structKeyExists(struct, 'struct2') && structKeyExists(struct.struct2, 'foo')) {}Utilisation de structKeyExists pour les objets imbriqués

Je pensais à l'aide structFindKey(), mais je ne veux pas courir dans un problème s'il existe struct1.foo

y at-il une meilleure façon d'y arriver?

Ceci est une question similaire à this question, mais je ne traite pas un document XML ainsi la plupart des réponses à ce poste ne fonctionne pas pour moi.

+3

_ « Je pense aussi que l'appel StructKeyExists() est deux fois plus inutile » _ - ce n'est pas inutile de faire quelque chose que vous devez faire. Voir http://stackoverflow.com/questions/13914841/displaying-struct-information-in-coldfusion/13918171#13918171 pour savoir comment simplifier le code. –

+0

Les fonctions dans les autres fonctions sont très utiles, mais trop pour ce cas particulier. Je vais juste utiliser structKeyExists() deux fois. – RHPT

Répondre

2

isDefined() pourrait renvoyer des résultats trompeurs. Ce n'est pas aussi précis que structKeyExists(). Et à moins que vous ne parcouriez ce code des milliers de fois lors d'un pop, vous ne remarquerez aucune différence de performance. Ils ont tous les deux assez bien. Mais si la clé n'existe pas, ce serait là où vous pourriez remarquer la différence (encore une fois, seulement avec des milliers d'itérations). isDefined() traversera les différentes étendues disponibles s'il ne peut pas le trouver au premier passage. Même si vous lui avez passé une variable qui semblait avoir spécifié la portée que vous vouliez vérifier. structKeyExists() est assez explicite dans la recherche de cette clé. S'il ne le trouve pas, il s'arrêtera et retournera FALSE. On dirait que vous faites un travail inutile, mais cela donne un résultat beaucoup plus précis. Et la lecture du code vous donne une bonne idée de ce que vous cherchez, donc vous n'avez pas à vous inquiéter de ne pas être propre.

La suggestion de Peter était plutôt bonne. Découvrez ce lien.

+0

Comment 'isDefined()' pourrait-il retourner des résultats trompeurs? – Henry

+0

Parce que CF vous permet d'utiliser des points dans un nom de variable, vous pouvez voir le problème si vous avez fait quelque chose d'étrange comme la création de variables.form.myVar et la transmission d'un formulaire avec un champ myVar. ' ... plus de code ici ...

Quel FORM.myVar obtient une sortie ici? # FORM.myVar # ' Sur la première charge de cette page, maVar du formulaire n'existerait pas. Mais 'isDefined()' retournerait TRUE. – Shawn

+0

Merci Shawn. Le programmeur qui utilise les variables [anyScopeName] devrait être pénalisé. :) – Henry

3

Ceci est la même question (bien plus succinctement mis) qui se trouve au cœur d'une question précédente:

How to dynamically loop through an array of structures

J'offrirait la même réponse.

How to dynamically loop through an array of structures

Pour répéter l'essentiel, la fonction suivante doit faire ce que vous voulez:

<cffunction name="StructGetByKeyList"> 
     <cfargument name="struct"> 
     <cfargument name="key"> 

     <cfif StructKeyExists(struct,ListFirst(key,"."))> 
      <cfif ListLen(key,".") GT 1> 
       <cfreturn StructGetByKeyList(struct[ListFirst(key,".")],ListRest(key,"."))> 
      <cfelse> 
       <cfreturn struct[key]> 
      </cfif> 
     <cfelse> 
      <cfreturn ""> 
     </cfif> 
</cffunction> 

alors vous pouvez appeler StructGetByKeyList (struct1, "struct2.foo") et il retournerait la chaîne pour la clé si elle existe et une chaîne vide si ce n'est pas le cas.

Pour retourner un booléen à la place, utilisez les touches suivantes:

<cffunction name="StructNestedKeyExists"> 
    <cfargument name="struct"> 
    <cfargument name="key"> 

    <cfif StructKeyExists(struct,ListFirst(key,"."))> 
     <cfif ListLen(key,".") GT 1> 
      <cfreturn StructNestedKeyExists(struct[ListFirst(key,".")],ListRest(key,"."))> 
     <cfelse> 
      <cfreturn true> 
     </cfif> 
    <cfelse> 
     <cfreturn false> 
    </cfif> 
</cffunction> 
Questions connexes