gpt4 book ai didi

arrays - Coldfusion:对象数组的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 05:36:07 26 4
gpt4 key购买 nike

所以,我遇到了一个非常令人沮丧的问题。我正在发送用于过滤 Coldfusion 对象的条件的 AJAX 调用(通过 jquery.post())。

处理非常简单。首先,执行检查以查看是否已传入某些过滤器。如果过滤器存在,则循环遍历 session 范围中的对象,并且如果对象元素之一的值与过滤器列表中的任何项目匹配值,该对象被添加到数组中。一旦针对所有定义的过滤器类型完成此过程,匹配对象的数组将存储在结果对象 (obj.results) 中,传递给 serializeJSON 函数,然后最终返回给客户端。

不幸的是,如果有多个过滤器在运行,循环似乎过早退出,导致返回的结果少于匹配项。如果我只处理下面包含的两个过滤器之一,我会得到完整的预期结果。同样,如果在下面的每个 arrayappend() 调用中,我将 s[i] 更改为 s[i].name(因此,附加字符串而不是对象),则为每个过滤器返回预期的结果数。

这是使用 s[i] 的代码:

<cffunction name="filterObj" access="public" returntype="any">
<cfargument name="filterParams" type="struct" required="yes">
<cfset var s = session.a> <!--- session.a IS AN ARRAY OF CF OBJECTS --->
<cfset filteredResults = {}>
<cfset filteredResults.eligibilities = []>
<cfset filteredResults.agencies = []>
<cfif isdefined("arguments.filterParams.agency")>
<cfloop from="1" to="#arraylen(s)#" index="i">
<cfif structkeyexists(s[i],"agency") and
listfindnocase(arguments.filterParams["agency"],s[i].agency["name"])>
<cfset arrayappend(filteredResults.agencies, s[i])>
</cfif>
</cfloop>
</cfif>
<cfif isdefined("arguments.filterParams.eligibility")>
<cfloop from="1" to="#arraylen(s)#" index="i">
<cfif structkeyexists(s[i],"el")>
<cfloop from="1" to="#arraylen(s[i].eligibility)#" index="e">
<cfif listfindnocase(arguments.filterParams["eligibility"],s[i].eligibility[e].type)>
<cfset arrayappend(filteredResults.eligibilities, s[i])>
</cfif>
</cfloop>
</cfif>
</cfloop>
</cfif>
<cfset obj.results = filteredResults>
<cfset obj = serializeJSON(obj)>
<cfreturn obj>
</cffunction>

这是使用 s[i] 未展开的 console.logged 结果
RESULTS: Object
AGENCIES: Array[5]
ELIGIBILITIES: Array[5]

这是再次使用 s[i].name 的代码
<cffunction name="filterObj" access="public" returntype="any">
<cfargument name="filterParams" type="struct" required="yes">
<cfset var s = session.a> <!--- session.a IS AN ARRAY OF CF OBJECTS --->
<cfset filteredResults = {}>
<cfset filteredResults.eligibilities = []>
<cfset filteredResults.agencies = []>
<cfif isdefined("arguments.filterParams.agency")>
<cfloop from="1" to="#arraylen(s)#" index="i">
<cfif structkeyexists(s[i],"agency") and
listfindnocase(arguments.filterParams["agency"],s[i].agency["name"])>
<cfset arrayappend(filteredResults.agencies, s[i].name)>
</cfif>
</cfloop>
</cfif>
<cfif isdefined("arguments.filterParams.eligibility")>
<cfloop from="1" to="#arraylen(s)#" index="i">
<cfif structkeyexists(s[i],"el")>
<cfloop from="1" to="#arraylen(s[i].eligibility)#" index="e">
<cfif listfindnocase(arguments.filterParams["eligibility"],s[i].eligibility[e].type)>
<cfset arrayappend(filteredResults.eligibilities, s[i].name)>
</cfif>
</cfloop>
</cfif>
</cfloop>
</cfif>
<cfset obj.results = filteredResults>
<cfset obj = serializeJSON(obj)>
<cfreturn obj>
</cffunction>

这是使用 s[i].name 未展开的 console.logged 结果
RESULTS: Object
AGENCIES: Array[10]
ELIGIBILITIES: Array[6]

我觉得必须对服务器上发生的两个循环进行某种异步处理,或者在循环完成之前某些东西超时了。

最佳答案

在某些版本的 CF9 和 CF10 中存在一个关于对象数组序列化的已知问题;通过将对象本身附加到返回变量,而不是所述对象的基于字符串的键,您偶然发现了这个错误。

这个错误可以通过这个简单的脚本重现:

<cfset obj = ArrayNew(1) />

<cfset obj[1] = StructNew() />
<cfset obj[1].name = "Kate" />
<cfset obj[2] = StructNew() />
<cfset obj[2].name = "Ted" />
<cfset obj[3] = StructNew() />
<cfset obj[3].name = "Phil" />

<cfset data = ArrayNew(1) />

<cfloop from="1" to="#ArrayLen(obj)#" index="i">
<cfset ArrayAppend(data, obj[i]) />
</cfloop>

<cfdump var=#data#>

<cfloop from="1" to="#ArrayLen(obj)#" index="i">
<cfset ArrayAppend(data, obj[i]) />
</cfloop>

<cfdump var=#data#>

<cfoutput>#ArrayLen(data)#</cfoutput>
<cfset json = SerializeJSON(data) />

<cfdump var=#json#>

<cfset converted = DeserializeJSON(json) />
<cfoutput>#ArrayLen(converted)#</cfoutput>

预期的结果是最终反序列化的数组长度为 6 个元素,因为它是预序列化的。但是,实际结果是 3。

坚持将字符串而不是整个对象附加到您返回的数组 var 中,如果您绝对必须在从函数返回它之前对其进行序列化,并重构调用此函数的外围代码。

来源: Problem with serializeJSON -- truncates embedded objects

关于arrays - Coldfusion:对象数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11907717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com