Задать вопрос
@Misha5
профессиональный бомж

Как превратить плоский массив в дерево?

Мне нужно определить, в каких элементах и в каком кол-ве есть дочерние подэлементы - проще говоря, составить treeview из json файла.

Я попытался решить все через рекурсию, но сейчас нахожусь в ступоре. Функция просто возвращает undefined.

Вот рекурсия:

function f1(p) {
   for (i = 0; i < p.length; i++) {
      var z = data.filter(obj => obj.parentId === p[i].id);
      if(z){
        f1(z);
      } 
      else continue;
   }
}

Наметки кода:

$(document).ready(function() {
	var tree = document.getElementsByClassName("tree");

	$.getJSON('some_json_ssilka', function(data) {

		function f1(p) {
			for (i = 0; i < p.length; i++) {
				var z = data.filter(obj => obj.parentId === p[i].id);
				if(z){
					f1(z);
				} 
				else continue;
			}
		}

		var level = data.filter(obj => obj.parentId === -1);
		console.log(f1(level));
	});
});

Исходные данные:

[
    {
       "id":2,
       "title":"Folder 1",
       "parentId":-1
    },
    {
       "id":3,
       "title":"Test",
       "parentId":1
    },
    {
       "id":-1,
       "title":"Folder 2",
       "parentId":null
    },
    {
       "id":1,
       "title":"Folder 2",
       "parentId":-1
    },
    {
       "id":4,
       "title":"Wrike",
       "parentId":2
    },
    {
       "id":5,
       "title":"Tester",
       "parentId":1
    }
 ]
  • Вопрос задан
  • 1053 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
попытался решить все через рекурсию

Рекурсией конечно можно:

const createTree = (data, parentId = null) =>
  data.reduce((acc, n) => (
    parentId === n.parentId && (
      acc[acc.length] = Object.assign(
        { children: createTree(data, n.id) },
        n
      )
    ),
    acc
  ), []);

Но вовсе не обязательно:

function createTree({
  data,
  key = 'id',
  parentKey = 'parentId',
  childrenKey = 'children',
}) {
  const tree = Object.fromEntries(data.map(n => [
    n[key],
    { ...n, [childrenKey]: [] },
  ]));

  return Object.values(tree).filter(n => !(
    tree[n[parentKey]] && tree[n[parentKey]][childrenKey].push(n)
  ));
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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