Сращивание неправильных элементов - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть массив 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)

Edit:

Ответ ниже не сработал, но это был определенно шаг в правильном направлении. Я немного повозился с кодом, и я думаю, что происходит то, что 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

Я получаю то же сообщение об ошибке, что и раньше

2-е редактирование:

Ошибка на самом деле [] is not a function

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Вы должны быть очень осторожными при редактировании массива, который вы просматриваете.Если вы находитесь на элементе 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 = []
0 голосов
/ 14 декабря 2011

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