Перебор и изменение многомерного массива объектов неопределенной глубины с помощью JS / Lodash - PullRequest
0 голосов
/ 31 мая 2018

У меня есть массив объектов, который выглядит примерно так:

treeData: [
    { title: 'Some site',
     url: 'www.somesite.com',
     children: [{ title: 'Another site', url: 'www.anothersite.com' }] },
     { title: 'Good site',
     url: 'www.goodsite.com',
     children: [{ title: 'Bad site', url: 'www.badsite.com',children:[same 
     pattern...] }] }
    ]

Каждый объект имеет свойства "title" и "url", а также может иметь массив "children", который следуетта же картина.Мне нужно перебрать каждый объект, добавить свойство «subtitle», которое идентично «url».Если бы это было только двумерное, я мог бы просто проверить, есть ли у него свойство "children", и действовать соответствующим образом, но, учитывая, что оно может иметь любое количество измерений (представьте многомерное выпадающее меню navbar), я подумал о переходе нарешение рекурсивной функции.Я сделал что-то подобное:

static convertUrlsToSubTitles(treeData) {

_.each(treeData, function (menu) {

  menu.subtitle = menu.url
  console.log(menu.subtitle)
  if (menu.children && menu.children.length > 0) {
    menu.children.forEach((child) => {
      SortableMenu.convertUrlsToSubTitles(menu.children);
    })        

  }
});

return treeData;

}

Это, конечно, совершенно некорректно и работает только для первого измерения.Как это может быть сделано?Любой тип решения будет с благодарностью

1 Ответ

0 голосов
/ 03 июня 2018

Ты почти понял.Это так просто:

static convertUrlsToSubTitles(collection) {
    for (let item of collection) {
        item.subtitle = item.url;
        if (item.children) {
            SortableMenu.convertUrlsToSubTitles(item.children);
        }
    }
}
  • Обратите внимание, что я пропустил оператор return, так как технически это не требуется - функция изменяет тот же объект «дерева», который вы передаете в него какВы называете это потому, что объекты (такие как массивы) передаются по ссылке
    и не копируются, поэтому нет необходимости возвращать ту же ссылку
    .

  • Я использовал for...of цикл вместо _.each Лодаша или стандартного forEach, поскольку это устраняет необходимость создания множества функциональных объектов при обходе очень глубоких "деревьев".

...