为了账号安全,请及时绑定邮箱和手机立即绑定

for...in 循环遍历对象数组返回“无法读取未定义的属性”

for...in 循环遍历对象数组返回“无法读取未定义的属性”

米琪卡哇伊 2021-06-30 06:08:57
我需要递归地浏览对象树,直到找到匹配的元素并将一些数据推送到其中。这是我的结构的简化示例: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;应该将它从那个树?)我不知道 for 循环和递归是什么?编辑:对不起!string.equals(id)来自 Mongoose - 它相当于string == id这个示例数组的用途。
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

currentNode.replies.length如果currentNode.replies未定义,则不能使用。你应该检查是否currentNode.replies不是null,会有点像这样:

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

编辑:同样适用于currentNode._idnull在调用之前检查它是否不是currentNode._id.equals



查看完整回答
反对 回复 2021-07-01
  • 1 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信