Object.keys遇到字符串的问题

来源:8-10 前端与树:遍历 JSON 的所有节点值

幕布斯6158635

2020-07-20

const json = {
    a: {
        b: {
            c: 1
        }
    },
    arr: ['a', 'b']
}

const dfs = (n, path) => {
    console.log(n, path);
    Object.keys(n).forEach(k => {
        dfs(n[k], path.concat(k))
    })
}
/* 控制台的输出
{a: {…}, arr: Array(2)} (0) []
{b: {…}} (1) ['a']
{c: 1} (2) ['a', 'b']
1 (3) ['a', 'b', 'c']
(2) ['a', 'b'] (1) ['arr']
a (2) ['arr', '0']
a (3) ['arr', '0', '0']
a (4) ['arr', '0', '0', '0']
a (5) ['arr', '0', '0', '0', '0']
...无限循环下去了
*/

Object.keys()碰到字符串就会无限循环下去啊。
因为字符串也是个可迭代对象,Object.keys(‘abc’)的结果就是一个[“0”, “1”, “2”]

所以我的想法是:在console.log(n, path)后面加一个判断if (typeof n === 'string') return; 这样子的话可以保证访问了字符串的数据以后不会发生陷入无限循环的情况。

const dfs = (n, path) => {
    console.log(n, path);
    if (typeof n === 'string') return;
    Object.keys(n).forEach(k => {
        dfs(n[k], path.concat(k))
    })
}

其他的情况还没有测试过。如果这个数据格式是json的话应该不存在其他的可迭代对象了吧。

写回答

1回答

lewis

2020-07-21

遇到obj或者 arr再递归

0
2
lewis
回复
guwu
注意递归终结的条件
2021-09-16
共2条回复

JavaScript版数据结构与算法 轻松解决前端算法面试

夯实算法基础,填补技术短板,助力面试考题最后一公里

2479 学习 · 683 问题

查看课程