拼接错误的元素

时间:2011-12-13 05:42:01

标签: arrays loops coffeescript client-side-scripting

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

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

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

  

无法读取未定义

的属性'item'

(这是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.subcomment s没有被定义为数组。 这导致错误,不会让它被推。这没有解释是没有从阵列中删除任何东西。

    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

2 个答案:

答案 0 :(得分:2)

编辑正在循环的数组时,您必须非常小心。如果您在元素i上,并将其从数组中删除,那么现在您处于以前的元素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 = []

答案 1 :(得分: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)