ColdFusion:从列表中选择第一个非空值

ColdFusion:从列表中选择第一个非空值,coldfusion,idioms,Coldfusion,Idioms,在JavaScript中,您可以执行以下操作: var a = null; var b = "I'm a value"; var c = null; var result = a || b || c; <cfset result = ListFirst( "#a#,#b#,#c#" )/> 而'result'将得到'b'的值,因为JavaScript使'or'运算符短路 我想在ColdFusion中使用一行成语来实现这一点,我能想到的最好方法是: <cfif LEN(c)

在JavaScript中,您可以执行以下操作:

var a = null;
var b = "I'm a value";
var c = null;
var result = a || b || c;
<cfset result = ListFirst( "#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没有空值

您的示例基于哪个项是空字符串的选择

如果这就是您所追求的,并且您的所有其他值都是简单值,那么您可以这样做:

var a = null;
var b = "I'm a value";
var c = null;
var result = a || b || c;
<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 ) />


谢谢你,彼得。如果所讨论的值可能包含逗号,请确保使用不同的delimeter。这是一个很好的观点。在过去,我使用Chr(65535)来实现这一目的,因为它不是一个实字符,但实际上起到了分隔符的作用。此外,如果要在检查空字符串时处理复杂变量,您可以在我的另一个答案中调整函数-只需将
not isNull
更改为
not(isSimpleValue(Arguments[I])和Arguments[I]EQ“”)
注意(在Peter评论Adobe ColdFusion不支持空值后添加):我知道ColdFusion不允许您创建或测试空值:^(根据我提出这个问题的原因,空字符串可以被视为等同于null。