Собесов

Frontend Яндекса — интерпретатор навигационного конфига (Охота за сокровищами)

АлгоритмыПарсинг и роутингСредняяMiddle

Условие

Дан конфиг навигации сайта-«охоты за сокровищами». Реализовать функцию-интерпретатор, которая по конфигу и пути возвращает целевой URL.

module.exports = async function interpretNavConfig(config, inputPath) {
  // TODO: реализуйте логику интерпретатора
  // Можно возвращать config.errorPath при ошибках
  return config.errorPath;
};

Правила

Конфиг содержит:

  • pathRules — список правил карты;
  • processors — набор обработчиков (опционально);
  • errorPath — путь, в который приводят ошибки.

Каждое правило имеет pattern и одно из destination или redirect. В destination/redirect могут использоваться плейсхолдеры {param} — они подставляются значениями параметров из pattern.

Шаблон pattern

segment1[param1][param2?][param3~]
  • segment — фиксированная часть пути.
  • [param] — сегмент-параметр.
  • ? — параметр опциональный.
  • ~ — игнорирование регистра (значение приводится к нижнему).
  • Допустимы только символы A-Z a-z 0-9 _ - (минимум 1 символ).
  • inputPath разбивается по /, пустые сегменты игнорируются.

Алгоритм

  1. match — найти первое правило (слева направо), которое полностью покрывает путь.
  2. redirect — подставить параметры в шаблон, начать заново с новым путём (без выполнения процессоров).
  3. processors — выполнить процессоры правила. Если процессор вернул строку — это новый путь, начинаем новый цикл.
  4. destination — вернуть destination с подстановками.

При любой ошибке — вернуть errorPath.

Примеры

// Пример 1: простое сопоставление
const config = {
  pathRules: [
    { pattern: "users[id]", destination: "/pages/user.html" }
  ],
  errorPath: "/pages/error.html"
};
await interpretNavConfig(config, "users/abc-01");
// → "/pages/user.html"
// Пример 2: опциональный параметр
const config = {
  pathRules: [
    { pattern: "archive[year][month?]", destination: "/pages/archive.html" }
  ],
  errorPath: "/pages/error.html"
};
await interpretNavConfig(config, "archive/2024");
// → "/pages/archive.html"
// Пример 3: лишние сегменты — нет совпадения
const config = {
  pathRules: [{ pattern: "a[b?]", destination: "/ok" }],
  errorPath: "/err"
};
await interpretNavConfig(config, "a/b/c");
// → "/err" (3 сегмента не подходят)

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти