Рекурсивный проход по массиву на JavaScript

const data = {
    group: "Group1",
    attributes: { name: "Item1" },
    children: [
        { attributes: { name: "SubItem1" } },
        { attributes: { name: "SubItem2" } },
        {
            group: "Group2",
            attributes: { name: "Item2" },
            children: [{ attributes: { name: "SubItem3" } }, { attributes: { name: "SubItem4" } }],
        },
    ],
};

результат

{
Group1: [Item1,SubItem1,SubItem2, Item2,SubItem3,SubItem4],
Group2: [Item2,SubItem3,SubItem4]
}

Порядок в массиве не имеет значение.


Ответы (1 шт):

Автор решения: ksa

не понимаю как написать рекурсию на чистом js

Предложу такой вариант...

const data = {
  group: "Group1",
  attributes: { name: "Item1" },
  children: [
    { attributes: { name: "SubItem1" } },
    { attributes: { name: "SubItem2" } },
    {
      group: "Group2",
      attributes: { name: "Item2" },
      children: [
        { attributes: { name: "SubItem3" } }, 
        { attributes: { name: "SubItem4" } }
      ],
    },
  ],
};
const group = test()
console.log(group(data))
//
function test() {
  const res = {}
  const arr = []
  return function loop(obj) {
    arr.push(obj.group)
    add(obj)
    obj.children.forEach(o => 'group' in o ? loop(o) : add(o))
    arr.pop()
    return res
  }
  //
  function add(obj) {
    arr.forEach(g => {
      res[g] ??= []
      res[g].push(obj.attributes.name)
    })
  }
}

→ Ссылка