Другая возможность - написать более обобщенную реализацию c nestedMap
, а затем передать ей функцию, которая добавляет ваше свойство. Вот как я мог бы написать это:
const nestedMap = (fn) => (xs) =>
xs .map (({children, ...rest}) => fn ({
... rest,
... (children ? {children: nestedMap (fn) (children)} : {})
}))
const addProp = (key, val) => (obj) =>
({... obj, [key]: val})
const pages = [{title: 'page1', children: [{title: 'page2', children: [{title: 'page4'}]}, {title: 'page3'}]}, {title: 'page5', children: []}]
console .log (
nestedMap (addProp ('checked', false)) (pages)
)
Эта версия не изменяет наш оригинал, но создает новый массив, полный новых объектов. (Это не делает полный клон; другие свойства наших узлов могут быть разделены ссылкой.)
addProp
достаточно просто: он принимает ключ и значение и возвращает функция, которая получает объект, возвращая новый объект со всеми его свойствами и новым ключом / значением.
nestedMap
рекурсивно отображает функцию в структуре node: {..., children: [more nodes]}
. Предоставленная ей функция преобразования вызывается сначала (рекурсивно) для дочерних элементов каждого узла, а затем для самого узла.