Холодное слияние:выберите первое ненулевое значение из списка

StackOverflow https://stackoverflow.com/questions/155435

  •  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 ) />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top