2010-01-07 12 views
11

La página 116 de la guía del desarrollador dice "A diferencia de la etiqueta cfloop, los bucles de CFScript for-in no proporcionan soporte integrado para bucles sobre consultas y listas."Enlazando listas en cf9

P: ¿Cómo se recorre una lista con la nueva sintaxis del script en ColdFusion 9?

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

Adam Cameron ha creado un recurso fantástico en https://github.com/ daccfml/cfscript/blob/master/cfscript.md –

Respuesta

19

También puede probar el listToArray y luego usar el constructo para-in para matrices en CF9 como:

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

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

</cfscript> 
+5

Tenga en cuenta que esto funciona pero solo con la Actualización 1 instalada. El CF9 original dará un error ya que for-in solo se permitió en struct's. – DaveBurns

+0

¿Es necesaria la variable intermedia "aCol" en este ejemplo? No sería 'for (fieldName en ListToArray (qry.ColumnList))' más limpio (menos contaminación del alcance)? –

+0

¿Creará una variable de matriz adicional, que implica una asignación de memoria adicional? ¿Eso significa que la etiqueta cfloop es más eficiente que hacer esas cosas en cfscript? Pregunto esto porque quiero persuadir al equipo de que use cfscript, pero le dan a este punto una desventaja. – 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> 

EDITAR mejor (tal vez un poco más rápido, por lazos muy fuertes) de la versión anterior:

<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

Forma un poco más corta: para (i = 1; i <= qry.RecordCount; i ++) {} – Sergii

+1

@Sergii: Ese es el punto, no se trata del 'RecordCount', pero sobre la longitud de 'ColumnList'. ;-) – Tomalak

+0

Oh, tienes razón. Lo siento :) – Sergii

5

Me gustaría convertir la lista en una matriz en primer lugar. ListGetAt() no es eficiente para ser llamado n veces en un bucle. ArrayLen(), sin embargo, debe ser bastante rápido.

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

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

¿No sería más rápido llamar a ArrayLen solo una vez y almacenarlo en una variable? –

+0

sí, lo haría. Solo quiero mantener el segmento de código pequeño y ordenado – Henry

+0

que tenga sentido ... y es más legible usando 'fieldName' que' arr [i] '. –

Cuestiones relacionadas