Javascript массив строк в глубоко слитый объект - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь преобразовать массив строк (со многими другими элементами):

fullRoutes = ['POST /api/v1/user/login','POST /api/v1/user/logout']

В такой глубокий вложенный объект (для использования в следующем модуле дерево-флажок-реакции ):

const nodes = [{
    value: 'api',
    label: 'api',
    children: [
        { value: 'v1', 
          label: 'v1', 
          children: [
              { value: 'user', 
                label: 'user', 
                children: [
                    { value: login, label: login},
                    { value: logout, label: logout}
                ] 
              }
           ]
        }
     ]

Мне удалось добраться до:

  fullRoutes.forEach(function(route){
    let path = route.split(" ")[1].split("/").filter(function(e){ return e === 0 || e })
    let object = {}

    path.reduce(function(o, s) {
       return o['children'] = {label: s, value: s, children: []}
     }, object)
    routes.push(object)
  })

Что возвращает объект с «детьми», но я изо всех сил пытаюсь слить их правильно

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Один из способов - свести все к объекту, включая children, и использовать путь в качестве ключа в дочерних элементах

Затем рекурсивно переберите все дочерние элементы и используйте Object#values(), чтобы преобразовать их из объектов в массивы

const fullRoutes = ['POST /api/v1/user/login', 'POST /api/v1/user/logout'];

const tmp = fullRoutes.reduce(function(tmp, route){
  let path = route.split(" ")[1].split("/");
  path.reduce(function(o, s, i) {
    o[s] = o[s] || {label: s, value: s, children: {}};
    return o[s].children;
  }, tmp); 
  return tmp;
},{});


const nodes = Object.values(tmp);

nodes.forEach(childrenToArray);

console.log(nodes)

//recursive helper 
function childrenToArray(obj) {
  obj.children = Object.values(obj.children);
  obj.children.forEach(childrenToArray)
}
.as-console-wrapper {max-height: 100%!important;}
0 голосов
/ 05 июля 2018

Я считаю, что это будет работать:

fullRoutes = [
  'POST /api/v1/user/login',
  'POST /api/v1/user/logout',
  'POST /api/v2/user/login'
];
routes = [];
fullRoutes.forEach(route => {
  let path = route.split(' ')[1].split('/').filter(e => e);
  let rs = routes;
  for (let i = 0, n = path.length; i < n; i++) {
    let seg = path[i];
    let segp = path.slice(0, i + 1).join('/');
    let node = rs.find(r => r.label == seg);
    if (!node)
      rs.push(node = {
        label: seg,
        value: segp,
        children: []
      });
    rs = node.children;
  }
});
console.log(routes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...