2010-01-07 241 views
11

開發人員指南的第116頁說 「與cfloop標記不同,CFScript for-in循環不提供循環查詢和列表的內置支持。」循環遍歷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 – 2014-11-06 17:46:43

回答

19

您也可以嘗試listToArray,然後使用for-in結構的陣列中CF9爲:

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

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

</cfscript> 
+5

請注意,這隻適用於Update 1。原來的CF9會給出一個錯誤,因爲只允許在struct中使用for-in。 – DaveBurns 2011-04-21 18:12:18

+0

這個例子中是否需要中間變量'aCol'?對於(ListToArray(qry.ColumnList)中的fieldName)''是否更清潔(少範圍污染)? – 2013-09-02 21:38:12

+0

它會創建額外的數組變量,這涉及額外的內存分配? 這是否意味着cfloop標籤比在cfscript中做這樣的東西更有效率? 我在問這個,因爲我想說服團隊使用cfscript,但他們給這個觀點是一個缺點。 – wyxa 2015-09-29 15:00:43

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> 

編輯一些好的以上的(也許甚至快一點,對於較重循環)版本:

<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

稍短的格式:for(i = 1; i <= qry.RecordCount; i ++){} – Sergii 2010-01-07 14:45:54

+1

@Sergii:這就是整個問題 - 不是關於'RecordCount'但是關於'ColumnList'的長度。 ;-) – Tomalak 2010-01-07 16:13:59

+0

哦,你說得對。對不起:) – Sergii 2010-01-07 16:18:25

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一次並將其存儲在一個變量中是否會更快? – 2011-04-18 16:17:06

+0

是的,它會。只是想保持代碼段小而整齊 – Henry 2011-04-18 18:04:56

+0

這是有道理的......它比'arr [i]'更容易使用'fieldName'進行讀取。 – 2011-04-18 18:07:21