Функция, которая принимает на вход функцию-обработчик и дерево, а возвращает отображенное дерево

207
27 декабря 2021, 07:10

Нужно реализовать функцию, которая принимает на вход функцию-обработчик и дерево, а возвращает отображенное дерево.

Вот дерево:

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);
Answer 1

Чуть подправил. Вы получаете результат 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)

READ ALSO
Работа с com-port-ами | JavaScript

Работа с com-port-ами | JavaScript

Возможно ли работать(читать) с com-port значения? То есть получать значение в реалтайме и выводить его в браузер с помощью JS

177
Множественное редактирование в MongoDB

Множественное редактирование в MongoDB

прошу помочь с решением моего вопросаРазрабатываю Node

194
Как реализовать такое Меню на javascript(jquery)?

Как реализовать такое Меню на javascript(jquery)?

Скажите, пожалуйста, как реализовать скролл у меню на мобильной версии? Фото прикладываюЛогика такая: когда пункты меню перестают влезать,...

255