【问题标题】:for...in loop through array of objects returns 'Cannot read property of undefined'for...in 循环遍历对象数组返回“无法读取未定义的属性”
【发布时间】: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

【问题讨论】:

  • 你需要用letvar声明currentNode,否则它是全局的。
  • 为什么不能使用 lodash 或 _?
  • String.equals 定义在哪里?你是说if (currentNode._id == id) 吗?
  • .equals 方法从何而来? JavaScript 中的普通比较类似于 comments.id === id

标签: javascript for-loop recursion


【解决方案1】:

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

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

编辑:currentNode._id 也是如此,在调用currentNode._id.equals 之前检查它是否不是null

【讨论】:

  • 谢谢!这解决了最初的问题——但现在我得到了RangeError: Maximum call stack size exceeded,我不明白为什么!我想我涵盖了所有情况??
猜你喜欢
  • 2017-09-04
  • 2020-05-11
  • 2021-07-16
  • 1970-01-01
  • 2016-06-19
  • 2014-08-15
  • 1970-01-01
  • 2013-02-19
  • 2020-08-06
相关资源
最近更新 更多