ColdFusion:如何检查数组元素是否存在?

ColdFusion: how to check if array element exists?

我必须遍历街道地址数组并将数据插入数据库。用户总是提供一行地址,有时两行。 我正在尝试循环数组并动态设置 address_1 和 address_2(如果存在或 NULL 如果不存在),但它对我不起作用。

这是我的资料:

<cfset address_1 = #jsonData.addresses.customer.street[1]#>
<cfif isDefined(jsonData.addresses.customer.street[2])>
    <cfset address_2 = #jsonData.addresses.customer.street[2]#> 
<cfelse>    
    <cfset address_2 = "">
</cfif>

当我 运行 它时,我得到这个: IsDefined 函数的参数 1,现在是 Suite 300,必须是语法上有效的变量名。

IsDefined 只能告诉您是否存在名为 jsonData.addresses.customer.street 的变量。它不能检查内容,所以它是这个场景的错误函数。

假设 street 数组始终存在,只需使用成员函数 len(), or ArrayLen() 检查它的大小。如果大小是 >= 2,那么你知道第二个地址存在。

<!--- Option 1: Member function len()  --->
<cfif jsonData.addresses.customer.street.len() gte 2 > 
   2nd address exists, do something 
</cfif>

<!--- Option 2: ArrayLen() --->
<cfif arrayLen(jsonData.addresses.customer.street) gte 2 > 
   2nd address exists, do something 
</cfif>

动态"address_x"变量

根据您最终要执行的操作,您可以考虑将地址信息保留为数组,因为在处理动态数量的元素时它更容易处理。但是,如果您愿意,也可以使用 <cfloop array="..">

动态定义单独的 address_x 变量
<!--- demo data --->
<cfset jsonData.addresses.customer.street = ["Line1","Line2","Line3"]>

<cfloop array="#jsonData.addresses.customer.street#" item="line" index="pos">
    <!--- Use the current position to name variables xx_1, xx_2, xx_3 --->
    <cfset variables["address_"& pos] = line>
</cfloop>

<!--- results --->
<cfdump var="#variables#">

结果:


关于原文错误

关于 IsDefined 的一个经常被误解的细节是函数需要变量的 name,通常是引号中的纯字符串,例如 "myVariable".由于此处变量名称周围没有引号:

<cfif isDefined( jsonData.addresses.customer.street[2] )>

... 该变量被计算,其 是实际传递到 IsDefined() 的值。所以代码最终检查了错误的变量名:

<!--- code is really doing this (thinks address[2] is the variable name) --->
<cfif isDefined("Suite 300")>

之所以会报错,是因为IsDefined()只接受valid CF variable names. So it can't be used on variable names containing special characters (spaces, square brackets, etc..) - meaning it won't work with a variable named Suite 300. That limitation is one of the reasons why StructKeyExists(),通常是推荐的。

这个问题的简单答案就是使用 A​​rrayIsDefined

<cfif ArrayIsDefined(yourArray, index)>
    <!--- perform your logic here --->
 </cfif>

这样你也可以防止可能出现的错误