2010-01-07 3 views
11

Стр. 116 из руководства разработчика говорит «В отличие от тега cfloop, петли forScript в CFScript не обеспечивают встроенную поддержку для циклирования запросов и списков».Цитирование по спискам в cf9

Вопрос: Как мне перебирать список, используя новый синтаксис скрипта в ColdFusion 9?

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

Адам Камерон собрал фантастический ресурс в https://github.com/ daccfml/cfscript/blob/master/cfscript.md –

ответ

19

Вы также можете попробовать listToArray, а затем использовать конструкцию для в для Массивы в CF9 как:

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

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

</cfscript> 
+5

Обратите внимание, что это работает, но только с установкой Update 1. Исходный CF9 даст ошибку, так как for-in разрешен только для struct. – DaveBurns

+0

Является ли промежуточная переменная 'aCol' необходимой в этом примере? Не будет 'for (fieldName в ListToArray (qry.ColumnList))' быть более чистым (меньше загрязнение области)? –

+0

Будет ли она создавать дополнительную переменную массива, которая подразумевает дополнительное распределение памяти? Означает ли это, что тег cfloop более эффективен, чем делать такие вещи в cfscript? Я прошу об этом, потому что я хочу убедить команду использовать cfscript, но они дают эту точку в качестве недостатка. – 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 симпатичнее (может быть, даже немного быстрее, для очень тяжелых петель) версии выше:

<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

Немного короче: для (i = 1; i <= qry.RecordCount; i ++) {} – Sergii

+1

@Sergii: В этом весь смысл - речь идет не о «RecordCount», но о длине 'ColumnList'. ;-) – Tomalak

+0

О, ты прав. Извините :) – Sergii

5

Я бы превратить список в массив первой. ListGetAt() не может быть вызван n раз в цикле. ArrayLen() однако должен быть довольно быстрым.

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

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

не так ли быстрее вызвать ArrayLen только один раз и сохранить его в переменной? –

+0

да это было бы. Просто хочу сохранить сегмент кода маленьким и опрятным – Henry

+0

, что имеет смысл ... и это более читаемо, используя 'fieldName', чем' arr [i] '. –