Конвертировать массив в дерево - PullRequest
0 голосов
/ 26 апреля 2019

Существует массив данных, который необходимо преобразовать в дерево:

const array = [{
  id: 5,
  name: 'vueJS',
  parentId: [3]
}, {
  id: 6,
  name: 'reactJS',
  parentId: [3]
}, {
  id: 3,
  name: 'js',
  parentId: [1]
}, {
  id: 1,
  name: 'development',
  parentId: null
}, {
  id: 4,
  name: 'oracle',
  parentId: [1,2]
}, {
  id: 2,
  name: 'data-analysis',
  parentId: null
}];

Теперь все работает с помощью этой функции:

function arrayToTree(array, parent) {
  var unflattenArray = [];
  array.forEach(function(item) {
    if(item.parentId === parent) {
      var children = arrayToTree(array, item.id);
      if(children.length) {
        item.children = children
      }
      unflattenArray.push(item)
    }
  });
  return unflattenArray;
}
console.log(arrayToTree(array, null));

У меня есть две проблемы с этой функцией:

  1. Значением parentId должен быть массив идентификаторов, например - "parentId": [2, 3]
  2. Как передать в функцию только один аргумент - "массив"?

https://codepen.io/pershay/pen/PgVJOO?editors=0010

1 Ответ

0 голосов
/ 27 апреля 2019

Я нахожу этот вопрос запутанным.Похоже, вы действительно говорите, что массив представляет собой «определение типов узлов в дереве», а не фактические экземпляры тех узлов, которые будут в дереве.

Итак, ваша проблема в том, что вам нужноскопируйте «определения» из массива в новые «экземпляры» узлов вашего дерева.Это позволит «Oracle» отображаться дважды, так как вы создадите новый узел «oracle instance» для каждого родителя в его родительском массиве.Технически это не должно быть глубоким копированием в зависимости от вашего использования, так что вы можете подтвердить концепцию с Object.assign, но каждый экземпляр будет указывать на один и тот же родительский массив, и это может или не может вызвать проблемы для той или иной ссылки.значения, которые вы добавляете к определению.

Наконец, в зависимости от размера дерева и того, что вы действительно пытаетесь сделать, вы можете захотеть преобразовать его в дерево, представленное узлами / ребрами вместо родителя / потомка.Для действительно больших наборов данных рекурсия может иногда вызывать проблемы.

Извините, я разговариваю по телефону, поэтому некоторые вещи трудно увидеть на коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...