Эквивалент StructKeyList () для значения структуры - PullRequest
0 голосов
/ 16 ноября 2018

StructKeyList() выдаст список структурных ключей с разделителями-запятыми. Теперь мне нужно получить значение структуры с разделителями-запятыми. Прямо сейчас это то, что я делаю, чтобы получить значение

<cfloop collection="#form#" item="key" >
    #form[key]#,
</cfloop>

Как я могу получить список значений из структуры без цикла? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Поскольку вы используете CF2016, если вы хотите избежать цикла, вы всегда можете использовать одну из функций высшего порядка, например reduce().

fields = formScope.reduce( function(result, key, value) { 
    result.append(value) ;
    return result ;
}, [] ) ; 

Это берет структуру вашей form области (formscope) и использует reduce(), чтобы пройти через нее и свести ее к одному значению (то есть значениям структуры, превращенным в массив). Затем мы превращаем возвращенный массив в список.

writeDump( fields.toList() )

Мой полный тестовый код на https://trycf.com/gist/f00cc62cd4631f44070faf8008e6788f/acf2016?theme=monokai

<cfscript>
formScope = { 
    empty1 : "" ,
    fieldl : "text1" ,
    field2 : "text2" ,
    empty2 : "" ,
    field3 : "text3" ,
    field4 : "text4" ,
    empty3 : ""
} ; 

fields = formScope?.reduce( function(result, key, value) { 
    len(value) ? result.append(value) : "" ;
    return result ;
}, [] ) ; 

writeDump( fields?.toList() ?: "Form doesn't exist." ) ; 
</cfscript>

Дает нам: text2,text3,text4,text1.

formScope - это моя смоделированная версия полей формы, которые будут переданы на эту страницу. Я использую в основном версии функций-членов StructReduce, ArrayAppend и ArrayToList. Я также использую необязательный параметр initialVal для инициализации значения result сокращения как массива. Я проверяю, что значение имеет длину (я могу также обрезать при необходимости), прежде чем вставлять строку в массив, что позволяет мне удалять пустые элементы из моего окончательного списка. Я также использую оператор безопасной навигации (?.), чтобы выполнить некоторую базовую проверку, чтобы убедиться, что элементы существуют (например, если форма не прошла или сокращение дало неверные результаты) и сделать ее более устойчивой к ошибкам.

ПРИМЕЧАНИЕ: Я полагаю, что это может быть возвращено для совместимости с CF11, когда был введен ArrayReduce.

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-s/structreduce.html http://ryanguill.com/functional/higher-order-functions/2016/05/18/higher-order-functions.html https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arraytolist.html

0 голосов
/ 16 ноября 2018

Я иду через вашу проблему. Насколько мне известно, невозможно получить список значений в структуре в рамках отдельных функций. Мы должны зациклить ключ и получить значение каждого. Но я могу дать решение для получения значения структуры с разделителями-запятыми.

<cfset strNew = {"a":"10","b":20,"c":30}>

Здесь strNew - моя примерная структура.

 <cfset  myList = ''>
<cfloop collection="#strNew#" item="key" >
    <cfset myList = listappend(myList,structfind(strNew,key))>
</cfloop>
<cfdump var="#myList#" />

Здесь я перебираю структурные ключи, нахожу значение определенного ключа и добавляю его в список и перечисляю с помощью функций listappend и structfind.

Так что вам не нужно ставить как #structure [key] #, в конце запятой (,) также добавляется последнее значение ключа. Например, ваш код должен возвращать 10,20,30.

Так что вам не нужно так поступать. используйте structfind и listappend, вы также можете избежать запятой. Надеюсь, это поможет вам.

...