0

我有一个数组comments。其中一些注释实际上是 中其他节点的子注释comments。每个comment都有一个num_comments,parent_idid属性。我知道当评论数大于 0 时,评论有子评论。

我想将子评论放在它的父评论中,并从数组中删除子评论。外部 for 循环完成后,数组内应该没有子评论comments,并且每个子评论都被移动到它的父评论 subcomments数组中。

问题是,运行此代码后,其中的每个项目都comments被删除,我得到:

无法读取未定义的属性“项目”

(这是comments空的结果。)

这是我遇到问题的代码:

    for comment in comments
        if comment.item.num_comments > 0
            comment.item.subcomments = [] unless comment.item.subcomments
            for comment_second in comments # Goes through a second time to find subcomments for the comment
                if comment_second.item.parent_id == comment.item.id
                    comment.item.subcomments.push(comment_second)
                    comments.splice(comments.indexOf(comment_second), 1)

编辑:

下面的答案不起作用,但这绝对是朝着正确方向迈出的一步。我把代码弄乱了一点,我认为正在发生的事情是temp_comment.item.subcomments 没有被定义为一个数组。这会导致一个不允许它被推送的错误。这没有解释的是没有从数组中删除任何内容。

    temp_comments = comments.slice(0)
    for comment in comments
      for comment_second in comments
        temp_comment = temp_comments[temp_comments.indexOf(comment)]
        temp_comment.item.subcomements = [] unless temp_comment.item.subcomments?
        if comment_second.item.parent_id == comment.item.id
          temp_comment.item.subcomments.push(comment_second)
          temp_comments.splice(temp_comments.indexOf(comment_second), 1)
    comments = temp_comments

我收到与以前相同的错误消息

第二次编辑:

错误实际上是[] is not a function

4

2 回答 2

2

编辑循环遍历的数组时必须非常小心。如果您在 element 上i,并且将其从数组中删除,那么现在您在之前的 element 上i + 1。但是随后循环增加,您已经跳过了最初的元素i + 1。在这里,您处于两个嵌套循环中,都在您正在修改的列表上,因此错误变得更加复杂。

这是一些我相信可以满足您要求的代码。

temp_comments = comments.slice(0)
for comment in comments
  for comment_second in comments
    if comment_second.item.parent_id == comment.item.id
      comment.item.subcomments.push(comment_second)
      temp_comments.splice(temp_comments.indexOf(comment_second), 1)
comments = temp_comments

在这里,我们创建了一个临时数组(comments.slice(0)是数组的浅拷贝习语)并修改了它而不是原始数组。

编辑:我假设评论对象是为此设置的。要解决此问题,请在拼接之前执行此操作:

for comment in comments
    comment.item.subcomments = []
于 2011-12-13T09:19:11.883 回答
0

我认为您仍在考虑使用 Javascript。

这应该做同样的事情并且更清楚。

# Add subcomments to all comments that have them
for comment in comments when comment.item.num_comments > 0
  comment.item.subcomments = (sub for sub in comments when sub.item.parent_id == comment.item.id)

# Filter out comments that have parents
comments = (comment for comment in comments when !comment.item.parent_id)
于 2011-12-14T04:18:27.913 回答