JS соответствует значению ключа в массиве, содержащем вложенные объекты и вложенные массивы - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужна эффективная функция для извлечения индекса и позиции аргумента в массиве - но массив может быть сложным.

Это массив:

let root_menu = {
        nav_title: $rootScope.t['General administration'],
        items: [
          { // overview
            title: $rootScope.t['Overview'],
            path: `/root/overview`,
            module: "overview/menu",
            icon: "fa fa-home"
          }, // overview
          { // cardboards
            title: $rootScope.t['Cardboards'],
            path: `/root/cardboards`,
            module: "cardboards/menu",
            icon: "fa fa-files-o",
            subs: [
              {
                title: $rootScope.t['Suppliers'],
                path: `/root/cardboards/suppliers`,
                module: "suppliers/menu",
                icon: "fa fa-handshake-o"
              },
              {
                title: $rootScope.t['Employees'],
                path: `/root/cardboards/employees`,
                module: "employees/menu",
                icon: "fa fa-address-book-o"
              },
            ]
          }, // cardboards
          { // charts
            title: $rootScope.t['Charts'],
            path: `/root/charts`,
            icon: "fa fa-area-chart",
            module: "charts/menu",
            subs: [
              {
                title: $rootScope.t['Activity'],
                path: `/root/charts/activity`,
                module: "charts/activity/menu"
              },
            ]
          }, // charts
          { // settings
            title: $rootScope.t['Settings'],
            path: `/root/settings`,
            module: "settings/menu",
            icon: "fa fa-cogs",
            subs: [
              {
                title: $rootScope.t['Permissions'],
                path: `/root/settings/permissions`,
                module: "settings/permissions/menu",
                icon: "fa fa-file-text-o"
              }
            ]
          } // settings
        ]
      };

Теперь у меня есть этот массив хлебных крошек:

["/", "/root", "/root/cardboards", "/root/cardoards/employees", "/root/cardboards/employees/123"]

И я хочу сопоставить каждый ключ (если есть) в массиве хлебных крошек с первым массивом, чтобы я мог получить что-то вроде этого:

[
 {path: "/root/cardboards/", title: "the title from the first 
 array"},
 {path: "/root/cardboards/employees", title: "the title from the . 
 first array"}
]

Как видите, если нет совпадения между вторым и первым массивом (под ключом пути), не должно быть вложения в новый массив.

Как я могу сделать это эффективно - лучше с ES6.

1 Ответ

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

Одним из решений может быть создание сопоставления пути к его объекту. Но для этого вам нужно рекурсивно перемещать массив items. Получив этот индекс / отображение, вы можете легко получить заголовок пути, обратившись к значению этого ключа пути в отображении:

let items = [{ // overview
    title: 'Overview',
    path: `/root/overview`,
    module: "overview/menu",
    icon: "fa fa-home"
  }, // overview
  { // cardboards
    title: 'Cardboards',
    path: `/root/cardboards`,
    module: "cardboards/menu",
    icon: "fa fa-files-o",
    subs: [{
        title: 'Suppliers',
        path: `/root/cardboards/suppliers`,
        module: "suppliers/menu",
        icon: "fa fa-handshake-o"
      },
      {
        title: 'Employees',
        path: `/root/cardboards/employees`,
        module: "employees/menu",
        icon: "fa fa-address-book-o"
      },
    ]
  }, // cardboards
  { // charts
    title: 'Charts',
    path: `/root/charts`,
    icon: "fa fa-area-chart",
    module: "charts/menu",
    subs: [{
      title: 'Activity',
      path: `/root/charts/activity`,
      module: "charts/activity/menu"
    }, ]
  }, // charts
  { // settings
    title: 'Settings',
    path: `/root/settings`,
    module: "settings/menu",
    icon: "fa fa-cogs",
    subs: [{
      title: 'Permissions',
      path: `/root/settings/permissions`,
      module: "settings/permissions/menu",
      icon: "fa fa-file-text-o"
    }]
  } // settings
];


function flatten(tree) {
  let res = [];
  function traverse(arr) {
    res.push(...arr);
    arr.forEach(o => traverse(o.subs || []));
  }
  traverse(tree);
  return res;
}

let pathIndex = flatten(items).reduce((acc, curr) => {
  if (curr.path) acc[curr.path] = curr;
  return acc;
}, {});

let breadcrumbs = ["/", "/root", "/root/cardboards", "/root/cardboards/employees", "/root/cardboards/employees/123"];
console.log(breadcrumbs.filter(path => path in pathIndex)
                       .map(path => ({title: pathIndex[path].title, path})));
                       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...