我正在创建一个博客API,并且在尝试在coldfusion中创建一个结构数组时遇到一些非常奇怪的问题。顶级数组将包含作为结构的帖子,其中.comments是该帖子下所有注释的数组,也是结构。
以下代码中的每个部分都单独工作。但是,不知何故,当我把它们放在一起时,我最终会得到一个无限嵌套的结构数组,其中包含一个结构数组等...所有这些只是顶级数组帖子中的最后一个元素。
<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />
<cfloop index="i" from="1" to="#arrayLen(posts)#">
<cfset post = posts[i].getInstance()>
<cfset StructInsert(post, 'comments', getComments(post.postId))>
<cfset ArrayAppend(result, post)>
</cfloop>
getBlogPosts返回一个Post bean数组 bean.getInstance()返回一个包含bean中所有数据的结构 getComments(id)返回一个数组post [id]的所有注释(结构)。
这些中的每一个都按预期工作,并在其他地方使用而没有任何问题。
无限嵌套数组的结构如下:
Array containing Post
. Post.comments containing array of comments + Post on end
. . Post.comments containing array of comments + Post on end
. . . etc...
答案 0 :(得分:8)
您没有显示整个代码。
我怀疑用这些中的任何一个替换你所做的就会解决问题:
<cfset local.posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset local.result = arraynew(1) />
<cfloop index="local.i" from="1" to="#arrayLen(local.posts)#">
<cfset local.post = local.posts[local.i].getInstance()>
<cfset StructInsert(local.post, 'comments', getComments(local.post.postId))>
<cfset ArrayAppend(local.result, local.post)>
</cfloop>
或者:
<cfset var posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset var result = arraynew(1) />
<cfset var i = 0 />
<cfset var post = 0 />
<cfloop index="i" from="1" to="#arrayLen(posts)#">
<cfset post = posts[i].getInstance()>
<cfset StructInsert(post, 'comments', getComments(post.postId))>
<cfset ArrayAppend(result, post)>
</cfloop>
您应该 始终 对cffunction中的变量使用var关键字或局部范围。
您可以使用VarScoper检查您需要修复的其他地方的代码。
答案 1 :(得分:0)
请尝试在其中添加一些cfdumps并报告您的内容:
<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />
<cfloop index="i" from="1" to="#arrayLen(posts)#">
<cfset post = posts[i].getInstance()>
<cfdump var="#post#">
<cfset StructInsert(post, 'comments', getComments(post.postId))>
<cfdump var="#post#">
<cfset ArrayAppend(result, post)>
<cfdump var="#result#"><cfabort>
</cfloop>
修改的
我认为问题是对父值的子引用,它在递归对象时产生无限循环。尝试改为:
<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />
<cfloop index="i" from="1" to="#arrayLen(posts)#">
<cfset post = posts[i].getInstance()>
<cfset StructInsert(post, 'comments', Duplicate(getComments(post.postId)))>
<cfset ArrayAppend(result, post)>
</cfloop>