我有一个comments
数组。其中一些注释实际上是comments
中其他节点的子注释。每个comment
都有num_comments
,parent_id
和id
属性。我知道当评论数量大于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
答案 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)