Условие
Реализовать функцию jsonPatch(obj, transformations), которая применяет набор функций-трансформаций к произвольному JSON-объекту.
export function jsonPatch(obj, transformations) {
// ваша реализация
}Параметры
obj— произвольный JSON: объекты, массивы, примитивы.transformations— массив функций-трансформаций. Каждая принимает(path, value):path— массив строк/чисел, путь от корня (строки — поля объектов, числа — индексы массивов).value— текущее значение узла (уже рекурсивно обработанное для вложенных контейнеров).
- Возвращает:
undefined— узел остаётся без изменений;null— узел удаляется;- любое другое — узел заменяется этим значением.
Алгоритм
- Рекурсивно обходим все узлы дерева.
- Для каждого узла применяются все трансформации в порядке массива. Каждая получает один и тот же вход — текущее значение (уже обработанное для вложенных). Трансформации не накопительные.
- Если несколько трансформаций вернули не-
undefined, используется результат последней (включаяnull). - После применения, если результат — объект или массив, обрабатывается рекурсивно.
- Узлы с итоговым
null— удаляются. - При удалении элементов массива — массив сжимается (без «дыр»).
Пути
- Корень —
[]. - Поле объекта —
['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)