【JS面试题】返回对象中指定层次的所有键名

简介: 返回对象中指定层次的所有键名

前几个月是面试的高峰期,我在群里看到了有几个小伙伴在面试时被问到了这样一个问题:


Q:封装一个函数key,传入两个参数,第一个为指定对象;第二个为指定的层次。函数作用是返回一个对象中指定层次的所有键名


例如现在有这样一个对象


    let obj = {    name: {        a: 1,        b: 2,        c: {            o: 9,            p: 10,            q: 11        }    },    age: {        m: 3,        n: 4    }
    }


    现在调用三次函数,分别为 key(obj, 1) 、key(obj, 2) 、key(obj, 3) 则得到以下结果


      key(obj, 1)   // 返回结果:['name', 'age']key(obj, 2)   // 返回结果:['a', 'b', 'c', 'm', 'n']key(obj, 3)   // 返回结果:['o', 'p', 'q']


      看它们当时讨论得挺激烈,方法各异,当时我就一想呀,这其实考察得就是一个递归,先递归获取每一层的键值,然后最后返回就可以了,我们来看一下代码思路是如何的吧


      A:  首先我们规定一下在递归过程中,存储数据的数据结构如何,结构类似这样:


        let arr = [    ['name', 'age'],  // 存放对象第一层的所有键值    ['a', 'b', 'c', 'm', 'n'],  // 存放对象第二层的所有键值    ['o', 'p', 'q']   // 存放对象第三层的所有键值]


        然后就来写一下封装的函数代码


          function key(o, level) {    // 创建空数组用于存储每个层次的键值    let arr = []    // 封装一个内部函数用于递归调用    function from(ob, l) {        // 遍历对象ob的第 l+1 层次的所有键值        Object.keys(ob).forEach(key => {            // 将key值添加到 arr 中存储            if(arr[l]) arr[l].push(key);            else {                arr[l] = [key]            }            // 这里做了一些优化,即不需要将原对象每一层都遍历出来            if(l !== level - 1) {                // 继续深入遍历下一层所有键名                from(ob[key], l + 1)            }        })         }    // 从原对象的第一层开始遍历    from(o, 0)    // 最后直接返回我们要的那一层的键值就可以啦    return arr[level - 1]   }


          所有的封装思路我都写在注释里啦,大家可以仔细看看,也可以亲自动手写一写。


          另外说一点小技巧,我在代码中其实略微得做了一点优化,这会给面试官留下很好的印象,因为他会发现你很细心,还会注意提高代码的运行效率。所以也建议你们在面试的过程中,在能力范围内对代码优化一下,会更加分哦~


          本次的面试题就到这儿啦。我是Lpyexplore,一个前端的探索者,关注我~带你了解不一样的前端干货


          相关文章
          |
          2天前
          |
          JavaScript 前端开发
          javascript判断对象中是否存在某个字段
          javascript判断对象中是否存在某个字段
          |
          2天前
          |
          JavaScript 前端开发
          JS遍历数组和对象的方法有哪些
          JS遍历数组和对象的方法有哪些
          |
          2天前
          |
          JavaScript
          js中批量修改对象属性
          js中批量修改对象属性
          |
          2天前
          |
          JavaScript 前端开发
          JavaScript BOM 浏览器对象模型
          JavaScript BOM 浏览器对象模型
          |
          3天前
          |
          JavaScript 前端开发 Unix
          Node.js 全局对象
          Node.js 全局对象
          10 2
          |
          4天前
          |
          JavaScript 前端开发
          深入解析JavaScript中的面向对象编程,包括对象的基本概念、创建对象的方法、继承机制以及面向对象编程的优势
          【6月更文挑战第12天】本文探讨JavaScript中的面向对象编程,解释了对象的基本概念,如属性和方法,以及基于原型的结构。介绍了创建对象的四种方法:字面量、构造函数、Object.create()和ES6的class关键字。还阐述了继承机制,包括原型链和ES6的class继承,并强调了面向对象编程的代码复用和模块化优势。
          11 0
          |
          5天前
          |
          存储 JSON JavaScript
          JavaScript基础-对象与JSON
          【6月更文挑战第11天】本文介绍了JavaScript对象的创建(字面量、构造函数、Class)与操作,包括属性访问和描述符。同时讲解了JSON的性质及其与JS对象的关系,以及序列化和解析过程。文章还列举了三个常见易错点(属性访问错误、JSON格式错误、循环引用)并提供了避免策略。通过代码示例展示如何操作对象和处理JSON,强调实践对于掌握这些概念的重要性。
          |
          12天前
          |
          JSON JavaScript 数据格式
          1.js动态的往json数据添加新属性和值 2.JSON 和 JS 对象互转 3.对象转化为数组
          1.js动态的往json数据添加新属性和值 2.JSON 和 JS 对象互转 3.对象转化为数组
          15 0
          |
          17天前
          |
          JavaScript
          分享经典面试题:JS数组去重的多种方法
          分享经典面试题:JS数组去重的多种方法
          |
          22天前
          |
          JavaScript 前端开发
          前端面试02(JS)
          本文是前端面试系列的第二篇,主要涵盖了JavaScript的基础知识,包括JS的组成(ECMAScript、DOM、BOM)、内置对象(如String、Array、Math、Date等)、数组操作方法、数据类型检测方法(typeof、instanceof、constructor、Object.prototype.toString.call)、闭包的概念及其特点、前端内存泄漏的原因和类型、事件委托的优势、基本数据类型与引用数据类型的差异、原型链的工作原理以及JS实现继承的多种方式(原型链、构造函数、组合继承等)。文章结尾鼓励读者点赞和支持作者。
          12 1