Untitled

 avatar
unknown
plain_text
2 years ago
1.9 kB
5
Indexable
module.exports = function (routeTree, data, urls) {
  const result = [];

  // Функция для построения маршрута
  function buildRoute(routeNode, path, params) {
    // Если есть параметризованный сегмент маршрута
    if (routeNode.route.startsWith(':')) {
      const entity = routeNode.route.slice(1);
      const entityId = params[entity];
      const title = data[entity][entityId];
      const route = `${path}/${entityId}`;

      result.push({ route, title });
    } else {
      const route = `${path}${routeNode.route}`;

      result.push({ route, title: routeNode.title });
    }

    // Рекурсивный обход дочерних элементов
    if (routeNode.children && routeNode.children.length > 0) {
      routeNode.children.forEach(child => {
        buildRoute(child, `${path}${routeNode.route}`, params);
      });
    }

    // Проверка наличия перенаправления
    if (routeNode.redirectTo) {
      const redirectTo = routeNode.redirectTo;
      const redirectNode = findRouteNode(routeTree, redirectTo);

      if (redirectNode) {
        buildRoute(redirectNode, path, params);
      }
    }
  }

  // Функция для поиска элемента RouteNode в дереве
  function findRouteNode(routeNode, route) {
    if (routeNode.route === route) {
      return routeNode;
    }

    if (routeNode.children && routeNode.children.length > 0) {
      for (const child of routeNode.children) {
        const foundNode = findRouteNode(child, route);
        if (foundNode) {
          return foundNode;
        }
      }
    }

    return null;
  }

  // Построение маршрутов для каждого URL
  for (const url of urls) {
    const routeParams = url.split('/').slice(1);
    buildRoute(routeTree, '', routeParams);
  }

  return result;
}
Editor is loading...