2016-09-07 1 views
2

Пожалуйста, обратите внимание на блок кода ниже:Любой лучший способ перебрать коллекцию (структуру) в CFML?

<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 тег с дорогим кодом, чтобы избежать запятая (,) в конце коллекции!

+1

Можете ли вы прояснить общую цель кода? Было бы правильным сказать, что вы хотите вывести каждый ключ в структуре, за которым следует значение указанного ключа, и разделили каждую пару k/v запятой? К сожалению, ваше использование CF9 действительно ограничивает то, что вы можете сделать. –

+0

У других вариантов CF есть лучшие способы сделать это? – edam

+1

Другие версии ColdFusion могут иметь лучшие способы сделать что-то, но самым важным фактором в отношении той версии, которую вы используете, является версия, используемая везде, где вы планируете вставить это в производство. –

ответ

2

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

Решение 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> 

Ура!

+0

Решение 1 заставляет меня хихикать. – Fergus

7

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

Настройка данных

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

CF9 Compat, преобразовывать данные в массив и использовать разделитель, чтобы добавить запятые

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

+0

Современный CFML часто медленнее, по крайней мере, в Adobe CF (не уверен в Lucee) – Henry

+1

Не говоря уже о том, что я видел этот код, я бы удалил его и сделаю его читаемым. – Leeish

+0

OP обеспокоен используемыми строками кода. (Не то, о чем я бы беспокоился лично, но неважно). Если вас больше беспокоит читаемость (благородный квест), то в примере «Современный CFML» можно легко ввести пробелы и ввести более длинные имена переменных. Это было бы доступно для всех, кто знаком с функциями сокращения более высокого порядка. –

0

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

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

<cfoutput>#html#</cfoutput> 

Readable, simple, works.

+0

Да, это работает в большинстве случаев. Хотя listAppend немного проще и работает, даже если структура пуста. – Leigh

+0

Итак, вы говорите 'listAppend (html," key ":" anotherPerson [key] # ")' – Leeish

+1

Да. Что-то вроде того, что они в конечном итоге использовали. – Leigh

Смежные вопросы