12

Page 116 of the developer's guide says "Unlike the cfloop tag, CFScript for-in loops do not provide built-in support for looping over queries and lists."

Q: How do I loop over a list using the new script syntax in ColdFusion 9?

<cfloop list="#qry.Columnlist#" index="FieldName">
   <cfset form[FieldName] = qry[FieldName][1]>
</cfloop>
James A Mohler
  • 11,060
  • 15
  • 46
  • 72
Phillip Senn
  • 46,771
  • 90
  • 257
  • 373
  • 1
    Adam Cameron has put together a fantastic resource at https://github.com/daccfml/cfscript/blob/master/cfscript.md – Phillip Senn Nov 06 '14 at 17:46

3 Answers3

18

You can also try the listToArray and then use the for-in construct for Arrays in CF9 as:

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

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

</cfscript>
Lostlinkpr
  • 1,453
  • 2
  • 12
  • 13
  • 5
    Note that this works but only with Update 1 installed. The original CF9 will give an error since for-in was only allowed on struct's. – DaveBurns Apr 21 '11 at 18:12
  • 1
    Is the intermediate variable `aCol` necessary in this example? Wouldn't `for(fieldName in ListToArray(qry.ColumnList))` be cleaner (less scope pollution)? – Jared Beck Sep 02 '13 at 21:38
  • Will it create additional array variable, that implicates additional memory allocation? Does that mean that cfloop tag is more efficient than doing such stuff in cfscript? I am asking this because I want to persuade team to use cfscript, but they giving this point as a disadvantage. – wyxa Sep 29 '15 at 15:00
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 (maybe a even little faster, for really heavy loops) version of the above:

<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>
jfrobishow
  • 2,897
  • 2
  • 27
  • 42
Tomalak
  • 332,285
  • 67
  • 532
  • 628
5

I would turn the list into an array first. ListGetAt() is not efficient to be called n times in a loop. ArrayLen() however should be quite fast.

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

for (i = 1; i <= ArrayLen(arr); i++)
{
    fieldName = arr[i];
    form[FieldName] = qry[FieldName][1];
}
</cfscript>
Henry
  • 32,689
  • 19
  • 120
  • 221