Холодное слияние:выберите первое ненулевое значение из списка
-
03-07-2019 - |
Вопрос
В JavaScript вы можете сделать это:
var a = null;
var b = "I'm a value";
var c = null;
var result = a || b || c;
И 'result' получит значение 'b', потому что JavaScript закорачивает оператор 'or'.
Мне нужна однострочная идиома, чтобы сделать это в ColdFusion, и лучшее, что я могу придумать, это:
<cfif LEN(c) GT 0><cfset result=c></cfif>
<cfif LEN(b) GT 0><cfset result=b></cfif>
<cfif LEN(a) GT 0><cfset result=a></cfif>
Может ли кто-нибудь сделать что-нибудь лучше этого?
Решение
В ColdFusion нет нулей.
Ваш пример основан на выборе того, какой элемент является пустой строкой.
Если это то, что вам нужно, и все ваши остальные значения являются простыми значениями, вы можете сделать это:
<cfset result = ListFirst( "#a#,#b#,#c#" )/>
(Что работает, потому что стандартные функции списка игнорируют пустые элементы.)
Другие советы
Примечание:другие движки CFML поддерживают нули.
Если мы действительно имеем дело с нулями (а не с пустыми строками), вот функция, которая будет работать для Railo и OpenBlueDragon:
<cffunction name="FirstNotNull" returntype="any" output="false">
<cfset var i = 0/>
<cfloop index="i" from="1" to="#ArrayLen(Arguments)#">
<cfif NOT isNull(Arguments[i]) >
<cfreturn Arguments[i] />
</cfif>
</cfloop>
</cffunction>
Тогда использовать эту функцию так же просто, как:
<cfset result = FirstNotNull( a , b , c ) />