Задать вопрос
Absurdity
@Absurdity

Как отсортировать узлы дерева?

Есть список разделов на сайте.
[
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030257",
            "name": "Наименование раздела",
            "order": 9999,
            "pid": ""
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030258",
            "name": "Наименование раздела",
            "order": 1,
            "pid": ""
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030259",
            "name": "Наименование раздела",
            "order": 2,
            "pid": ""
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030260",
            "name": "Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030257"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030261",
            "name": "Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030257"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030262",
            "name": "Б Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030261"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030263",
            "name": "А Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030261"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030264",
            "name": "Наименование раздела",
            "order": 1,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030261"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030265",
            "name": "Б Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030258"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030266",
            "name": "A Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030258"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030267",
            "name": "Наименование раздела",
            "order": 1,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030258"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030268",
            "name": "А Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030259"
        },
        {
            "id": "42cb4b1d-bf84-11eb-bb8f-001520030269",
            "name": "Б Наименование раздела",
            "order": 9999,
            "pid": "42cb4b1d-bf84-11eb-bb8f-001520030259"
        }
]

Необходимо его вывести как дерево, но с учетом двойной сортировки: по полю order и по алфавиту. От меньшего к большему. Если на одном уровне разделы с одинаковым значение order (по умолчанию 9999), то сортировать их по алфавиту.

Нужно что-то вроде этого:

Раздел Г (id: 'asda', pid: '', order: 1)
     Раздел Ж (id: 'bbda', pid: 'asda', order: 1)
     Раздел А (id: 'bfda', pid: 'asda', order: 9999)
     Раздел Б (id: 'bbda', pid: 'asda', order: 9999)
Раздел Е (id: 'asfa', pid: '', order: 2)
Раздел А (id: 'afda', pid: '', order: 9999)
Раздел Б (id: 'abda', pid: '', order: 9999)

Для построения дерева есть функция:

stucture_input = structure.objects;

stucture_output = function (data, root) {
    let t = {};
    data.forEach(o => {
        Object.assign(t[o.id] = t[o.id] || {}, o);
        t[o.pid] = t[o.pid] || {};
        t[o.pid].children = t[o.pid].children || [];
        t[o.pid].children.push(t[o.id]);
    });

    return t[root].children;
}(stucture_input, '');

Но как сделать двойную сортировку, не могу предположить.
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Object.values(t).forEach(n => {
  n.children?.sort((a, b) => (a.order - b.order) || a.name.localeCompare(b.name));
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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