parentNode
— лишнее дублирование инфы.
Можно раз пройти по массиву, расставляя элементам их адреса в дереве.
Адрес — массив, или строка через разделитель. Содержать в себе адреса родителей и собственный. Например:
{ id: 1, address: [0], children: [
{ id: 2, address: [0, 0], children: [
{ id: 3, address: [0, 0, 0], },
{ id: 99, address: [0, 0, 1], },
{ id: 999, address: [0, 0, 2], },
]}
]}
Так каждый элемент дерева получает уникальный идентификатор, и всю структуру уже можно делать плоской.
В общем-то после расстановки адресов, уже можно отказаться от дерева и держать плоский список – массив, объект или
Map()
:
[0]: {title: 'первый', id: 1, }, // поле children убрали
[0, 0]: { title: 'второй', id: 2 },
[0, 0, 0]: { title: 'третий', id: 3 },
Известен узел с его адресом — известна вся цепочка родителей и их адреса.