我有一个嵌套对象和一个路径,它们描述了对象中的位置。我想使用给定的路径访问树尾的对象。例如,我想获取对象的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"
}
]
}
]
}
]
}
]
}
答案 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。
您想要做的是使该代码段适应您的数据,并使用额外的逻辑扩展代码,以在发现结果后停止递归。