12
votes

Boucle sur les listes de cf9

page 116 du Guide du développeur dit "Contrairement à la balise CFLOOOOP, les boucles forestières CFScript ne fournissent pas de support intégrée à la boucle sur les requêtes et les listes."

Q: Comment puis-je boucler sur une liste à l'aide de la nouvelle syntaxe de script à ColdFusion 9? P >

<cfloop list="#qry.Columnlist#" index="FieldName">
   <cfset form[FieldName] = qry[FieldName][1]>
</cfloop>


1 commentaires

Adam Cameron a mis en place une ressource fantastique à github.com/daccfml/cfscript/blob /master/cfscript.md


3 Réponses :


12
votes
<cfscript>
  var i = 0;
  var Fields = ListToArray(qry.Columnlist);
  var FieldName = "";
  var l = arrayLen(Fields);
  for (i = 1; i lte l; i = i + 1)  // you also can use i++ instead
  {
    FieldName = Fields[i];
    form[FieldName] = qry[FieldName][1];
  }
</cfscript>

2 commentaires

Forme légèrement plus courte: pour (i = 1; i <= qrecordcount; i ++) {}


@SegiII: C'est tout le point - il ne s'agit pas de l'enregistrement , mais de la longueur de la liste de colonne . ;-)



5
votes

Je vais d'abord tourner la liste en une matrice. LISTGETTAT () CODE> n'est pas efficace pour être appelé n fois dans une boucle. ArrayLen () Code> Cependant, devrait être assez rapide.

<cfscript>
arr = ListToArray(qry.Columnlist);

for (i = 1; i <= ArrayLen(arr); i++)
{
    fieldName = arr[i];
    form[FieldName] = qry[FieldName][1];
}
</cfscript>


7 commentaires

Ne serait-il pas aussi plus rapide d'appeler Arraylen une seule fois et de la stocker dans une variable?


oui ça le ferait. Voulez-vous simplement garder le segment de code petit et soigné


Cela a du sens ... et il est plus lisible en utilisant nom de terrain que arr [i] .


J'utiliserais probablement un pour (élément in matry) boucle ici, Henry. Vous n'avez besoin que de la valeur d'index ici pour obtenir l'élément, vous pourriez aussi bien ne pas vous embêter avec elle.


@AdamCameron ... il a été répondu en 2010 et je doute que la boucle pour le tableau était mature ou même existante. :)


Coldfusion 9? Bien sûr qu'ils l'ont fait. Et je ne l'aurais pas suggéré si ce n'était pas une suggestion appropriée.


@Adamcameron Voir Daveburns Commenter avec 3 votants sur l'autre réponse.



18
votes

Vous pouvez également essayer le ListToArray, puis utiliser la construction intégrée pour les tableaux en CF9 comme suit:

<cfscript>
aCol = listToArray (qry.ColumnList);

for( fieldName in aCol ){
    form[fieldName]  = qry[fieldName][1];
}

</cfscript>


3 commentaires

Notez que cela fonctionne, mais uniquement avec la mise à jour 1 installée. L'original CF9 donnera une erreur car l'intestinité n'a été autorisée que sur les structures.


Est la variable intermédiaire acol nécessaire dans cet exemple? POUR (Nom de terrain dans ListToarray (QRY.Columnlist)) Soyez plus propre (moins de pollution de la portée)?


Créera-t-il une variable de matrice supplémentaire, qui implique une allocation de mémoire supplémentaire? Cela signifie-t-il que la balise CFLOOP est plus efficace que de faire des choses telles que cfscript? Je pose cela parce que je veux persuader l'équipe d'utiliser cfscript, mais ils donnent ce point comme un désavantage.