如何返回对象中指定层次的所有键名

146 阅读1分钟

题目

封装一个函数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]   
}