Собесов

Frontend Яндекса — jsonPatch: рекурсивные трансформации JSON-объекта

АлгоритмыРекурсия и обход дереваСредняяMiddle

Условие

Реализовать функцию jsonPatch(obj, transformations), которая применяет набор функций-трансформаций к произвольному JSON-объекту.

export function jsonPatch(obj, transformations) {
  // ваша реализация
}

Параметры

  • obj — произвольный JSON: объекты, массивы, примитивы.
  • transformations — массив функций-трансформаций. Каждая принимает (path, value):
    • path — массив строк/чисел, путь от корня (строки — поля объектов, числа — индексы массивов).
    • value — текущее значение узла (уже рекурсивно обработанное для вложенных контейнеров).
  • Возвращает:
    • undefined — узел остаётся без изменений;
    • null — узел удаляется;
    • любое другое — узел заменяется этим значением.

Алгоритм

  1. Рекурсивно обходим все узлы дерева.
  2. Для каждого узла применяются все трансформации в порядке массива. Каждая получает один и тот же вход — текущее значение (уже обработанное для вложенных). Трансформации не накопительные.
  3. Если несколько трансформаций вернули не-undefined, используется результат последней (включая null).
  4. После применения, если результат — объект или массив, обрабатывается рекурсивно.
  5. Узлы с итоговым null — удаляются.
  6. При удалении элементов массива — массив сжимается (без «дыр»).

Пути

  • Корень — [].
  • Поле объекта — ['fieldName'].
  • Элемент массива — ['arrayName', 0].
  • Вложенное — ['parent', 'child'].

Пример

const obj = { a: 1, b: 2 };
const transformations = [
  (path, value) => {
    if (typeof value === 'number') return value * 10;
  },
  (path) => {
    if (path.length === 1 && path[0] === 'b') return null;
  },
];
const result = jsonPatch(obj, transformations);
// → { a: 10 }   ('b' удалён, 'a' умножен на 10)

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

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

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