Мне нужно рекурсивно перемещаться по дереву объектов, пока я не найду соответствующий элемент и не вставлю в него некоторые данные.Вот упрощенный пример моей структуры:
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
для чисел этого примера массива.