ColdFusion:从列表中选择第一个非空值
在JavaScript中,您可以执行以下操作: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)
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。