@DaveGarrow

Как подняться до родителя объекта?

Есть массив из ~3000 объектов. Из него отрисовываются дивы с названиями, типа дерева
Например -
const myArray = [
    {
        title: 'первый',
        id: 1, 
        children: [
            {
                title: 'второй',
                id: 2, 
                children: [
                    {
                        title: 'третий',
                        id: 3, 
                        parentNode: {
                            title: 'второй',
                            id: 2, 
                            children: []
                        }
                    }
                ],
                parentNode: {
                    title: 'первый',
                    id: 1, 
                    children: []
                }
            }
        ]
    },
    {
        title: 'четвертый',
        id: 4, 
        children: [
            {
                title: 'пятый',
                id: 5, 
                parentNode: {
                    title: 'четвертый',
                    id: 4, 
                    children: []
                }
            }
        ]
    },
    ...
]

parentNode я задаю каждому, рекурсивно пробегаясь первый раз по массиву.
Через поисковую строку я, например, нахожу объект с title - третий. Добавляю ему ключ - isFound: true. И теперь мне надо, чтобы у всех его родителей (Второй и Первый) был ключ isParent: true.

Так как я получаю parentNode конкретного объекта, то могу снова пробегаться по всему массиву и искать уже конкретный id. Но так придется часто бегать по всему массиву, плюс id у некоторых объектов могут совпадать при получении массива.

Каким образом еще это можно реализовать?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
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 },

Известен узел с его адресом — известна вся цепочка родителей и их адреса.
Ответ написан
Ваш ответ на вопрос

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

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