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再递归
022021-09-16
相似问题