注意:该题目摘录自:https://juejin.im/post/58d088...。我这里稍微做了些修改。

  1. 题目描述

    写一个方法,在一个未知对象中,找出所有的“李鹏” 并 console.log 对象输出它的引用地址,以及对应值。例如下面的一个对象:

    var tarrgetObj = {

       a: {
           b: {
               c: {
                   d: {
                       e: {
                           name: "百度"
                       }
                   },
                   l: {
                       name: "李鹏--> QQ:3206064928"
                   }
               }
           }
       },
       d: "90",
       e: "90",
       l: {
           a: {
               b: {
                   c: {
                       version: "1.0.0.1",
                       name: "李鹏--> QQ:3206064928"
                   }
               }
           }
       }
     } 
    
  2. 解法
    这个题目考察的是应该是递归和Js中对object的理解,以及对typeof的应用。
    我下面先贴出我自己的解法的核心代码:
    图片描述
  3. 思路讲解
    (1)首先,我定义了两个数组path和result。其中path用于记录当前的已经走过的“路径”,它是一个临时变量;而result用于记录全部符合要求的数据。
    (2)利用for循环遍历对象。需要注意的是,由于这是个未知“深度”的对象,所以我这里使用了递归。这样就可以把所有的“元素”都遍历一遍。明白了这个之后,下面的代码就是判断“元素”是否为‘object’。(我这里多一句嘴,关于typeof的用法,大家可以参考这里。)如果是object的话,那么就继续递归调用我们的方法;如果不是object,那么我们就取出它的值并判断是否符合我们的要求。如果符合,就把值添加到我们的result数组中。其实,这个思路最最终的一点就是path.pop(),或许有人要问:这里有这一句的代码有什么作用?下面我把调试信息贴出来,大家就能明白。
    图片描述
    看了上图,就能明白,这里是利用递归的特点将path中走过的路径 一个一个剔除出去。想要明白这个思路,正确理解递归是前提。真心希望这个题目能够帮助到您。不足之处,还请大家指出。

李运华
12 声望1 粉丝

努力做一个会独立思考的动物