Проблемы с созданием массива структур - PullRequest
4 голосов
/ 15 ноября 2011

Я делаю 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 возвращает массив объектов EJB.
bean.getInstance () возвращает структуру со всеми данными в компоненте.
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...

Ответы [ 2 ]

8 голосов
/ 15 ноября 2011

Вы не показали весь код.

Я подозреваю, что замена того, что вы показывали, одним из них решит проблему:

<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>

Вам следует всегда использовать ключевое слово var или локальную область видимости для переменных в функции.

Вы можете использовать VarScoper , чтобы проверить ваш код на наличие другихместа, где это нужно исправить.

0 голосов
/ 15 ноября 2011

Пожалуйста, попробуйте добавить туда несколько 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...