Untitled
unknown
plain_text
3 years ago
1.9 kB
8
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...