以编程方式浏览JavaScript中的嵌套对象

时间:2018-11-20 15:42:12

标签: javascript object recursion path nested

我有一个嵌套对象和一个路径,它们描述了对象中的位置。我想使用给定的路径访问树尾的对象。例如,我想获取对象的ID,其中的路径为“ contracts / access / roles / MinterRole.sol” 。我该怎么办?是否可以不递归遍历整个树?谢谢!

我的对象如下所示:

{  
   "name":"contracts",
   "toggled":true,
   "id":0,
   "children":[  
      {  
         "name":"access",
         "toggled":false,
         "id":1,
         "children":[  
            {  
               "name":"Roles.sol",
               "id":2,
               "path":"contracts/access/Roles.sol",
               "dependencies":[  

               ]
            },
            {  
               "name":"roles",
               "toggled":false,
               "id":3,
               "children":[  
                  {  
                     "name":"CapperRole.sol",
                     "id":4,
                     "path":"contracts/access/roles/CapperRole.sol",
                     "dependencies":[  
                        {  
                           "fileName":"Roles.sol",
                           "absolutePath":"contracts/access/Roles.sol"
                        }
                     ]
                  },
                  {  
                     "name":"MinterRole.sol",
                     "id":5,
                     "path":"contracts/access/roles/MinterRole.sol",
                     "dependencies":[  
                        {  
                           "fileName":"Roles.sol",
                           "absolutePath":"contracts/access/Roles.sol"
                        }
                     ]
                  },
                  {  
                     "name":"PauserRole.sol",
                     "id":6,
                     "path":"contracts/access/roles/PauserRole.sol",
                     "dependencies":[  
                        {  
                           "fileName":"Roles.sol",
                           "absolutePath":"contracts/access/Roles.sol"
                        }
                     ]
                  },
                  {  
                     "name":"SignerRole.sol",
                     "id":7,
                     "path":"contracts/access/roles/SignerRole.sol",
                     "dependencies":[  
                        {  
                           "fileName":"Roles.sol",
                           "absolutePath":"contracts/access/Roles.sol"
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

2 个答案:

答案 0 :(得分:0)

我在斜线处分割了路径,然后对其进行迭代。如果将整个对象也包装在一个数组中,则将变得更加容易。

const pathParts = path.split("/");
let currentNode = mainTree;
pathParts.forEach(part => {
    if (currentNode && currentNode.children) {
        currentNode = currentNode.children.find(child => child.name === part);
    }
});

请注意,尽管这是迭代的,但它仍将在与路径名匹配的给定级别的节点上停止,之后再跳过任何内容。只要不对树进行排序(即二叉树之类的东西),那便是最好的选择。

答案 1 :(得分:0)

递归是一种方法。

您可能想看看D. Crockford亲自写过的著名的walk the DOM snippet

您想要做的是使该代码段适应您的数据,并使用额外的逻辑扩展代码,以在发现结果后停止递归。