【发布时间】:2019-10-28 04:59:29
【问题描述】:
我需要递归地浏览对象树,直到找到匹配的元素并将一些数据推入其中。这是我的结构的简化示例:
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)
此函数似乎只读取第一个评论对象的子节点,然后在到达没有子节点的节点时以“无法读取属性‘等于’未定义’退出(但我认为 continue; 应该拉它是从那棵树的树枝上出来的吗?)
对于循环和递归,我没有了解什么?
编辑:对不起! string.equals(id) 来自 Mongoose - 对于此示例数组的用途,它等同于 string == id。
【问题讨论】:
-
你需要用
let或var声明currentNode,否则它是全局的。 -
为什么不能使用 lodash 或 _?
-
String.equals 定义在哪里?你是说
if (currentNode._id == id)吗? -
.equals方法从何而来? JavaScript 中的普通比较类似于comments.id === id。
标签: javascript for-loop recursion