@dGololobov
начинающий

Как перестроить массив объектов?

Всем привет!

Есть массив категорий:
[
{id: 1, name: 'Категория 0-1', parent: 0},
{id: 2, name: 'Категория 0-2', parent: 0},
{id: 3, name: 'Категория 0-3', parent: 0},
{id: 4, name: 'Категория 1-1', parent: 1},
{id: 5, name: 'Категория 1-2', parent: 1},
]


на выходе хочу получить:
[
{id: 1, name: 'Категория 0-1', parent: 0,
 child: [
 {id: 4, name: 'Категория 1-1', parent: 1},
 {id: 5, name: 'Категория 1-2', parent: 1},
]
},
{id: 2, name: 'Категория 0-2', parent: 0},
{id: 3, name: 'Категория 0-3', parent: 0},
]


Уровней вложенности может быть сколько угодно.

Помогите составить рекурсивную функцию.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
Xuxicheta
@Xuxicheta
инженер
const tree = arr.reduce((sum, el) => {
	if (el.parent === 0) {
  	sum.push(el)
  } else {
  	const parent = arr.find(p => p.id === el.parent);
  	parent.children = parent.children || [];
  	parent.children.push(el);
  }
  return sum;
}, []);


тут нет нужды в рекурсии.
Следует отметить, что элементы исходного массива тоже будут изменены. Если это неприемлемо, нужно сначала склонировать.
O(n^2)

А вот обратная задача будет уже решаться с помощью рекурсии.
Ответ написан
NeiroNx
@NeiroNx
Программист
Нужна рекурсивная функция:
var data = [
{id: 1, name: 'Категория 0-1', parent: 0},
{id: 2, name: 'Категория 0-2', parent: 0},
{id: 3, name: 'Категория 0-3', parent: 0},
{id: 4, name: 'Категория 1-1', parent: 1},
{id: 5, name: 'Категория 1-2', parent: 1},
];
var getChilds = (data,par)=>data.filter((el)=>el.parent == par).map(el=>{el["childs"]=getChilds(data,el.id);return el;});
var tree = getChilds(data,0)

результат JSON.stringify(tree,"\n",4)
[
    {
        "id": 1,
        "name": "Категория 0-1",
        "parent": 0,
        "childs": [
            {
                "id": 4,
                "name": "Категория 1-1",
                "parent": 1,
                "childs": []
            },
            {
                "id": 5,
                "name": "Категория 1-2",
                "parent": 1,
                "childs": []
            }
        ]
    },
    {
        "id": 2,
        "name": "Категория 0-2",
        "parent": 0,
        "childs": []
    },
    {
        "id": 3,
        "name": "Категория 0-3",
        "parent": 0,
        "childs": []
    }
]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если в исходном массиве потомки всегда идут после родителя, то никакой рекурсии не надо.
var flat = [
  {id: 1, name: 'Категория 0-1', parent: 0},
  {id: 2, name: 'Категория 0-2', parent: 0},
  {id: 3, name: 'Категория 0-3', parent: 0},
  {id: 4, name: 'Категория 1-1', parent: 1},
  {id: 5, name: 'Категория 1-2', parent: 1}
];

var els = [];
var tree = [];
for (var i = 0; i < flat.length; i++) {
  flat[i].childs = [];
  if (flat[i].parent == 0) {
    tree.push(flat[i]);
  } else {
    els[flat[i].parent].childs.push(flat[i]);
  }
  els[flat[i].id] = flat[i];
}
console.log(tree);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы