访问无限嵌套的子对象

时间:2018-12-20 05:48:21

标签: javascript algorithm

想知道如何在JS中访问无限嵌套的对象?

请考虑以下示例作为我的面试官

您有一个对象,该对象具有父对象和无限嵌套的子对象

[ 
 { 
   name: "Jack",
   age: "98" ,
   profession: "doctor
   children: [
               {
                 name: "Varun",
                 age: "80"
                 profession: "scientist"
                 children: [
                             {
                                name: "Ishan"
                                age: "62",
                                profession: "teacher
                                children: [{....
                                 .....
                                 .....[{
                                       name: "Rahul",
                                       age: "23",
                                       profession: "engineer"
                                      children: [{
                                                  .....

我需要找到专业是“工程师”的位置以及给定对象嵌套的深度对应的名称。

注意:此处要考虑的孩子数是无限的。

问题:有人可以帮助我弄清楚如何使用递归不使用递归

更新:他给了我提示使用分而治之

更新:根据Bary的解决方案,我尝试了类似的方法

let infiniteArray = [ 
    { 
      name: "Jack",
      age: "98" ,
      profession: "doctor",
      children: [
                  {
                    name: "Varun",
                    age: "80",
                    profession: "scientist",
                    children: [
                                {
                                   name: "Ishan",
                                   age: "62",
                                   profession: "teacher"
                                }
                            ]
                    }
                ]
        }
]


function isTheItem(item) {
   if (item["profession"] === "teacher") return item
    return false
 }


 function walk(collection) {
    return collection.find(item => isTheItem(item) || walk(item.children));
  }

但是当我进行console.log记录时,即console.log(walk(infiniteArray)),它记录了整个infiniteArray,我知道为什么,但是我去了它,只是返回了与行业相对应的名称。对我如何实现有帮助吗?

  name: "Ishan",
        age: "62",
        profession: "teacher"
    }

2 个答案:

答案 0 :(得分:3)

在收藏中有两个方向 *同胞 *嵌套

因此您可以使用常规数组迭代器迭代此兄弟项,然后递归遍历每个项的子项。

function isTheItem(item) {
   return ...;
}

function walk(collection) {
  return collection.find(item => isTheItem(item) || walk(item.children));
}

答案 1 :(得分:0)

除征和征服算法通常与对数组中的值进行排序(在采访过程中)有更多关系。如果您按年龄或其他排序,我可以看到这只是一个提示。但是,当搜索无限数量的嵌套对象的键值对时,无法真正进行分而治之。您必须搜索n个值,直到找到结果。使用要查找的存储的随机键值对,对象的任何划分都不一定会提高效率。

如果我错了,更多经验丰富的开发人员会纠正我

Barry Gane为您为实际应用编写的代码提供了良好的开端。