ColdFusion中数组的奇怪行为

Beg*_*ner 5 coldfusion removeall cfml coldfusion-11

我面临一段代码问题,略有修改我得到的结果不同,不应该是这种情况.

版本1给出了正确的结果,我遇到了版本2的问题,这是实际的代码.

版本1:

<cfset keywords = listToArray("1,2,3,4,5,6,7,8,9,10")>

<!--- Common Code Below --->
<cfoutput>#getMetadata(keywords).getName()#</cfoutput>

<cfset toBeAdded = keywords>
<cfset toBeInactivated = listToArray("1,3,4,6,8")>
<cfset toBeActivated = toBeInactivated>

<cfset toBeAdded.removeAll(toBeInactivated)>
<cfset toBeInactivated.removeAll(keywords)>
<cfset toBeActivated.retainAll(keywords)>
Run Code Online (Sandbox Code Playgroud)

版本2:

<cfset keywords = []>
<cfloop from="1" to="10" index="counter">
    <cfset arrayAppend( keywords, counter )>
</cfloop>

<!--- If I add following line here then it is working as expected and similar to version 1:  --->
<!--- <cfset keywords = listToArray(arrayToList(keywords))> --->

<!--- Common Code Below --->
<cfoutput>#getMetadata(keywords).getName()#</cfoutput>

<cfset toBeAdded = keywords>
<cfset toBeInactivated = listToArray("1,3,4,6,8")>
<cfset toBeActivated = toBeInactivated>

<cfset toBeAdded.removeAll(toBeInactivated)>
<cfset toBeInactivated.removeAll(keywords)>
<cfset toBeActivated.retainAll(keywords)>
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述在此输入图像描述

以下是要点:Version 1Version 2.

任何建议都非常感谢!

Ton*_*kes 6

我不是Java人,而是我能说的......

在版本1中:keywords包含java.lang.String值,在版本2中:keywords包含java.lang.Double值.

在版本2中:toBeInactivated包含要从双精度数组中删除的字符串值.

由于这些Java类型不匹配,因此不会正确地从集合中删除它们.我猜测当CF传递底层对象数据时,它从未正确传输.老实说,当CF的所有东西都没有类型时,我都会期待.

在下面的@Twillen评论中添加,当你counter转换为以下类型时,这是有效的java.lang.String:

<cfset keywords = []>
<cfloop from="1" to="10" index="counter">
    <cfset arrayAppend( keywords, javaCast("string", counter) )>
</cfloop>


<!--- Common Code Below --->
<cfoutput>#getMetadata(keywords).getName()#</cfoutput>

<cfset toBeAdded = keywords>
<cfset toBeInactivated = listToArray("1,3,4,6,8")>
<cfset toBeActivated = toBeInactivated>

<cfset toBeAdded.removeAll(toBeInactivated)>
<cfset toBeInactivated.removeAll(keywords)>
<cfset toBeActivated.retainAll(keywords)>

<cfdump var="#toBeAdded#" label="To Be Added">
<cfdump var="#toBeInactivated#" label="To Be Inactivated">
<cfdump var="#toBeActivated#" label="To Be Activated">
Run Code Online (Sandbox Code Playgroud)

  • 你在我完成我之前完成了答案.我要添加的唯一内容是你可以通过将值转换为带有`arrayAppend(keywords,JavaCast("String",counter)`的字符串来匹配版本1. (3认同)