Нужно реализовать функцию, которая принимает на вход функцию-обработчик и дерево, а возвращает отображенное дерево.
Вот дерево:
const tree = {
name: '/',
type: 'directory',
meta: {},
children: [
{
name: 'ETC',
type: 'directory',
meta: {},
children: [
{
name: 'NGINX',
type: 'directory',
meta: {},
children: [],
},
{
name: 'CONSUL',
type: 'directory',
meta: {},
children: [{ name: 'CONFIG.JSON', type: 'file', meta: {} }],
},
],
},
{ name: 'HOSTS', type: 'file', meta: {} },
],
};
Мое решение(которое очевидно, не верное)
const map = (f, tree) => {
const newEl = f(tree);
const childrens = newEl.children
if(newEl.type === 'directory'){
return [newEl, childrens.map(el => map(f,el))]
}
return {newEl};
};
Вот вызов:
map(n => ({ ...n, name: n.name.toLowerCase() }), tree);
Чуть подправил. Вы получаете результат map, но не присваиваете его элементам children. Так же не надо возвращать массив, так как Вы хотите вернуть обратно дерево. После выполнения map прототипа Array, значения передадутся по ссылке, поэтому просто присвойте children новые к старому массиву. Последний return не нужно превращать в объект, так как Вы и так имеете объект на входе.
const tree = {
name: '/',
type: 'directory',
meta: {},
children: [
{
name: 'ETC',
type: 'directory',
meta: {},
children: [
{
name: 'NGINX',
type: 'directory',
meta: {},
children: [],
},
{
name: 'CONSUL',
type: 'directory',
meta: {},
children: [{ name: 'CONFIG.JSON', type: 'file', meta: {} }],
},
],
},
{ name: 'HOSTS', type: 'file', meta: {} },
],
};
const map = (f, tree) => {
const newEl = f(tree);
if(newEl.type === 'directory') newEl.children = newEl.children.map(el => el = map(f,el));
return newEl;
};
const result = map(n => {n.name = n.name.toLowerCase(); return n;}, tree);
console.log(result)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей