for ... в цикле через массив объектов возвращает 'Cannot read свойство undefined' - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно рекурсивно перемещаться по дереву объектов, пока я не найду соответствующий элемент и не вставлю в него некоторые данные.Вот упрощенный пример моей структуры:


post.comments = [
    {
        _id: a,
        content: 'Foo',
        replies: [
            {
                _id: aa,
                content: 'Foobar',
                replies: [
                    {
                        _id: aaa,
                        content: 'Foobarbaz',
                        replies: [...]
                    }
                ]
            },
            {
                _id: ab,
                content: 'Barfoo',
                replies: [...]
            }
        ]
    },
    {
        _id: b,
        content: 'Bar',
        replies: [...]
    },
    {
        _id: c,
        content: 'Bar',
        replies: [...]
    },
    ...
]

Теоретически, ответы могут быть вложенными бесконечно.

А вот моя рекурсивная функция:

function findNode(comments, id, data) {
    for (let key in comments) {
        currentNode = comments[key]
        if (currentNode._id.equals(id)) {
            currentNode.replies.push(data)
            break;
        } else {
            if (currentNode.replies.length) {
                findNode(currentNode.replies, id, data)
            }
            else {
                continue;
            }
        }
    }
}

findNode(post.comments, id, comment)

Эта функциякажется, только для чтения через дочерние узлы первого объекта комментария, а затем завершается с 'Cannot read property' равно 'undefined', когда он достигает узла без потомков (но я предположил, что continue; должен вытащить его из этой ветвидерева?)

Что это я не получаю для циклов и рекурсии?

РЕДАКТИРОВАТЬ : Извините!string.equals(id) происходит от Mongoose - это эквивалентно string == id для чисел этого примера массива.

1 Ответ

4 голосов
/ 13 июня 2019

Вы не можете использовать currentNode.replies.length, если currentNode.replies не определено. Вы должны проверить, если currentNode.replies не null, будет выглядеть примерно так:

if (currentNode.replies && if currentNode.replies.length) { ...

РЕДАКТИРОВАТЬ: то же самое относится к currentNode._id, проверьте, не является ли оно null, прежде чем звонить currentNode._id.equals.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...