Взгляните на блок кода ниже:

<cfset index = 0 />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset index = index+1 />
    <cfoutput> 
         #key# : #anotherPerson[key]# 
         <cfif index lt ArrayLen(structKeyArray(anotherPerson))> , </cfif>
    </cfoutput>
</cfloop>

<!--- Result 

   age : 24 , haar : Blondes haar , sex : female , ort : Hanau

---->

Скажите, пожалуйста, как я могу добиться того же результата, не устанавливая индекс снаружи и не увеличивая его внутри цикла? Если вы внимательно заметили, мне пришлось написать еще два тега cfset и один тег cfif с дорогостоящим кодом, чтобы избежать запятой (,) в конец коллекции!

3
edam 7 Сен 2016 в 14:22

3 ответа

Лучший ответ

Некоторые друзья предложили два разных решения. Оба они эффективны и элегантны!

Решение 1

<cfset isFirst = true />
<cfloop collection="#anotherPerson#" item="key" >
    <cfif isFirst>
        <cfset isFirst = false />
    <cfelse> 
        ,   
    </cfif> 
    <cfoutput> 
       #key# : #anotherPerson[key]# 
    </cfoutput>
</cfloop>

Решение 2

<cfset resultList = "" />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset resultList = ListAppend(resultList, "#key# : #anotherPerson[key]#" ) />
</cfloop>

Ура!

4
Community 9 Сен 2016 в 03:49

Просто обрежьте запятую, когда закончите, никакой логики пропуска не требуется.

<cfset html = '' />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset html &= "#key# : #anotherPerson[key]# , " />
</cfloop>
<cfset html = left(html,len(html)-3) />

<cfoutput>#html#</cfoutput>

Разборчиво, просто, работает.

0
Leeish 8 Сен 2016 в 15:06

Хорошо, я показываю вам два ответа. Первый будет работать на ColdFusion 9. Поскольку другие люди могут найти этот поток и использовать Lucee Server или более новую версию Adobe ColdFusion, я включаю однострочник, который использует функции более высокого порядка и работает на ACF 2016. Их много. синтаксического сахара (например, функций-членов) и функционального программирования, которого вам не хватает из-за CF9. В этих ответах используется сценарий, потому что управление данными не является чем-то для представления (где используются теги / шаблоны).

Настройте данные

myStruct = { 'age'=24, 'haar'='Blondes haar', 'sex'='female', 'ort'='Hanau' };

Совместимость с CF9 , преобразуйте данные в массив и используйте разделитель для добавления запятых.

myArray = [];
for( key in myStruct ) {
    arrayAppend( myArray, key & ' : ' & myStruct[ key ] );
}
writeOutput( arrayToList( myArray, ', ' ) );

Современный CFML. Используйте замыкание сокращения структуры для преобразования каждого ключа в агрегированный массив, который затем превращается в список.

writeOutput( myStruct.reduce( function(r,k,v,s){ return r.append( k & ' : ' & s[ k ] );  }, [] ).toList( ', ' ) );

http://cfdocs.org/structreduce

7
John Whish 7 Сен 2016 в 16:50