2010-01-07 19 views
11

La page 116 du guide du développeur indique "Contrairement à la balise cfloop, les boucles CFScript for-in n'offrent pas de prise en charge intégrée de la mise en boucle des requêtes et des listes." Q: Comment faire une boucle sur une liste en utilisant la nouvelle syntaxe de script dans ColdFusion 9?La boucle sur les listes dans cf9

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

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

Répondre

19

Vous pouvez également essayer le listToArray puis utilisez la pour en construction pour les tableaux en CF9 comme:

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

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

</cfscript> 
+5

Notez que cela fonctionne mais seulement avec la mise à jour 1 installé. Le CF9 original donnera une erreur puisque le for-in n'était autorisé que sur struct. – DaveBurns

+0

La variable intermédiaire 'aCol' est-elle nécessaire dans cet exemple? Ne serait pas 'pour (fieldName dans ListToArray (qry.ColumnList))' être plus propre (moins de pollution de la portée)? –

+0

Va-t-il créer une variable de tableau supplémentaire, impliquant une allocation de mémoire supplémentaire? Cela signifie-t-il que la balise cfloop est plus efficace que de faire de telles choses dans cfscript? Je pose cette question parce que je veux persuader l'équipe d'utiliser cfscript, mais ils donnent ce point comme désavantage. – wyxa

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

EDIT Nicer (peut-être un peu plus vite même, pour vraiment des boucles lourdes) version de ce qui précède:

<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> 
+0

Forme légèrement plus courte: pour (i = 1; i <= qry.RecordCount; i ++) {} – Sergii

+1

@Sergii: C'est tout le problème - il ne s'agit pas de 'RecordCount', mais à propos de la longueur de 'ColumnList'. ;-) – Tomalak

+0

Oh, vous avez raison. Désolé :) – Sergii

5

Je tournerais la liste dans un tableau premier. ListGetAt() n'est pas efficace pour être appelé n fois dans une boucle. ArrayLen() devrait cependant être assez rapide.

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

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

ne serait-il pas plus rapide d'appeler ArrayLen une seule fois et de le stocker dans une variable? –

+0

oui ce serait. Je veux juste garder le segment de code petit et net – Henry

+0

qui a du sens ... et il est plus lisible en utilisant 'fieldName' que' arr [i] '. –