题目
封装一个函数key,传入两个参数,第一个为指定对象;第二个为指定的层次。函数作用是返回一个对象中指定层次的所有键名
示例
let obj = {
name: {
a: 1,
b: 2,
c: {
o: 9,
p: 10,
q: 11
}
},
age: {
m: 3,
n: 4
}
}
key(obj, 1) // 返回结果:['name', 'age']
key(obj, 2) // 返回结果:['a', 'b', 'c', 'm', 'n']
key(obj, 3) // 返回结果:['o', 'p', 'q']
解法
思路: 把对象的key值转换为数组
let arr = [ ['name', 'age'], // 存放对象第一层的所有键值
['a', 'b', 'c', 'm', 'n'], // 存放对象第二层的所有键值
['o', 'p', 'q'] // 存放对象第三层的所有键值
]
代码
function key(obj, level) {
// 创建空数组用于存储每个层次的键值
let arr = []
// 封装一个内部函数用于递归调用
function tranform(ob, index) {
// 遍历对象ob的第 l+1 层次的所有键值
Object.keys(ob).forEach(key => {
// 将key值添加到 arr 中存储
if(arr[index]) arr[index].push(key);
else {
arr[index] = [key]
}
// 这里做了一些优化,即不需要将原对象每一层都遍历出来
if(index !== level - 1) {
// 继续深入遍历下一层所有键名
tranform(ob[key], index + 1)
}
})
}
// 从原对象的第一层开始遍历
tranform(obj, 0)
// 最后直接返回我们要的那一层的键值就可以啦
return arr[level - 1]
}