Как преобразовать одномерный массив категорий, подкатегорий и под-подкатегорий в массив с вложенными категориями?

Какая информация содержится в массиве?
  • 11 января 2024 г. 10:18
Ответы на вопрос 1
Чтобы преобразовать одномерный массив категорий с подкатегориями и под-подкатегориями в многоуровневый массив с вложенными категориями, нужно знать структуру исходного массива, так как в зависимости от формата данных алгоритм может сильно отличаться.

Исходный одномерный массив может быть представлен, например, в таких формах:

1. Список объектов, где каждый объект содержит информацию о своем уровне в иерархии и, возможно, ссылку на родителя:
```json
[
  {"id": 1, "name": "Категория 1", "parent_id": null},
  {"id": 2, "name": "Подкатегория 1.1", "parent_id": 1},
  {"id": 3, "name": "Подкатегория 1.2", "parent_id": 1},
  {"id": 4, "name": "Под-подкатегория 1.1.1", "parent_id": 2},
  // ... и так далее
]
```

2. Массив простых строк, где уровень иерархии определен через разделитель или пробелы:
```plaintext
[
  "Категория 1",
  "  Подкатегория 1.1",
  "    Под-подкатегория 1.1.1",
  "  Подкатегория 1.2",
  // ... и так далее
]
```

Чтобы преобразовать данные в многоуровневый массив, нужно выполнить следующие шаги:

1. Инициализировать структуру, которая будет хранить иерархию.
2. Пройтись по одномерному массиву и для каждого элемента определить его уровень и родительскую категорию.
3. Добавить каждый элемент как вложенный элемент в соответствующую его родительскую категорию.

Давайте рассмотрим преобразование для первого случая — списка объектов:

```python
data = [
    {"id": 1, "name": "Категория 1", "parent_id": None},
    {"id": 2, "name": "Подкатегория 1.1", "parent_id": 1},
    {"id": 3, "name": "Подкатегория 1.2", "parent_id": 1},
    {"id": 4, "name": "Под-подкатегория 1.1.1", "parent_id": 2},
    # ... и так далее
]

# Инициализация пустого словаря для хранения иерархии
tree = {}
# Вспомогательный словарь для хранения ссылок на узлы дерева
references = {}

# Создаем структуру дерева
for item in data:
    # Добавляем пустой список для дочерних элементов
    item['children'] = []
    # Записываем узел в словарь ссылок
    references[item['id']] = item
    # Если это корневой элемент (нет родителя), добавляем в дерево
    if item['parent_id'] is None:
        tree[item['id']] = item
    else:
        # Иначе добавляем текущий элемент в список дочерних у его родителя
        parent = references[item['parent_id']]
        parent['children'].append(item)

# Выводим итоговое дерево
print(tree)
```

В этом примере мы создаем иерархическую структуру, похожую на дерево, где каждый узел содержит ссылку на свои дочерние узлы, которые сами являются узлами с дочерними элементами.

Если у вас другой формат массива, процесс преобраз
Похожие вопросы