Программная навигация по вложенным объектам в JavaScript - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть вложенный объект и путь , который описывает положение в объекте.Я хотел бы получить доступ к объекту в конце дерева с указанным путем.Например, я хотел бы получить идентификатор объекта, где путь "контрактов / доступа / ролей / 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 голосов
/ 20 ноября 2018

Рекурсия - это путь.

Возможно, вы захотите взглянуть на полуизвестную прогулку по фрагменту DOM самого Д. Крокфорда.

То, что вы хотите сделать, - это адаптировать этот фрагмент к вашим данным и дополнить код дополнительной логикой, чтобы остановить рекурсию, если был найден результат.

0 голосов
/ 20 ноября 2018

Я бы разделил путь на слэше, а затем просто прошел бы по нему.Это облегчает, если вы также оборачиваете весь объект в массив.

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

Обратите внимание, что, хотя это итеративно, оно все равно остановится на узле на данном уровне, соответствующем имени пути, пропускаячто-нибудь после.Пока дерево не упорядочено (т.е. двоичное дерево или что-то в этом роде), это лучшее, что вы можете сделать.

...