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

我需要递归地浏览对象树,直到找到匹配的元素并将一些数据推送到其中。这是我的结构的简化示例:



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这个示例数组的用途。


米琪卡哇伊
浏览 320回答 1
1回答

慕工程0101907

currentNode.replies.length如果currentNode.replies未定义,则不能使用。你应该检查是否currentNode.replies不是null,会有点像这样:if (currentNode.replies && currentNode.replies.length) { ...编辑:同样适用于currentNode._id,null在调用之前检查它是否不是currentNode._id.equals。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript