Индекс сортировки из вложенного JSON с помощью Javascript - PullRequest
0 голосов
/ 20 ноября 2018

Как я могу рекурсивно добавить ключ сортировки в бесконечную иерархию следующим образом:

[
    {
        "id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
        "name": "A",
        "parent_id": null,
        "sortNr": 1,
        "children": [
            {
                "id": "07E556EE-F66F-49B5-B5E4-54AFC6A4DD9F",
                "name": "A-C",
                "parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
                "sortNr": 3,
                "children": []
            },
            {
                "id": "8C63981E-0D30-4244-94BE-658BAAF40EF3",
                "name": "A-A",
                "parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
                "sortNr": 1,
                "children": [
                    {
                        "id": "0BA32F23-A2CD-4488-8868-40AD5E0D3F09",
                        "name": "A-A-A",
                        "parent_id": "8C63981E-0D30-4244-94BE-658BAAF40EF3",
                        "sortNr": 1,
                        "children": []
                    }
                ]
            },
            {
                "id": "17A07D6E-462F-4983-B308-7D0F6ADC5328",
                "name": "A-B",
                "parent_id": "D41F4D3D-EA9C-4A38-A504-4415086EFFF8",
                "sortNr": 2,
                "children": []
            }
        ]
    },
    {
        "id": "64535599-13F1-474C-98D0-67337562A621",
        "name": "B",
        "parent_id": null,
        "sortNr": 2,
        "children": []
    },
    {
        "id": "1CE38295-B933-4457-BBAB-F1B4A4AFC828",
        "name": "C",
        "parent_id": null,
        "sortNr": 3,
        "children": [
            {
                "id": "D1E02274-33AA-476E-BA31-A4E60438C23F",
                "name": "C-A",
                "parent_id": "1CE38295-B933-4457-BBAB-F1B4A4AFC828",
                "sortNr": 1,
                "children": [
                    {
                        "id": "76A8259C-650D-482B-91CE-D69D379EB759",
                        "name": "C-A-A",
                        "parent_id": "D1E02274-33AA-476E-BA31-A4E60438C23F",
                        "sortNr": 1,
                        "children": []
                    }
                ]
            }
        ]
    }
]

Я хочу получить сортируемый индекс.Например, 0000.0001.0003 или 0001.0003 для узла AC.

Функция для ведущих нулей:

function fillZeroes (num) {
    var result = ('0000'+num).slice(-4);
    if (num===null){
       return result
    } else {
    return '0000';
    }
}

Она должна быть отсортирована по номеру сортировки на каждом уровне иерархии, каждый раз должен быть установлен новый номер сортировки, потому что я хочу сделать перестановку с помощьюустановите его 1,5, чтобы вставить его между 1 и 2 (позже для возможности перетаскивания).так что 1;1,5;2 должно стать 1;2;3 и затем может быть переведено в индекс сортировки, как указано выше.

Он также понадобится мне для отступов и прочего.

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

Вопрос в основном о рекурсивной части.Я совершенно новичок в JavaScript

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Основано на великолепном ответе @georg.Немного скорректированное решение на основе свойства объекта sortNr.Вы можете запустить его прямо как есть с json, являющимся вашим объектом.Индекс сортировки записывается в свойство sortOrder.

// Mutates the given object in-place.
// Assigns sortOrder property to each nested object
const indexJson = (json) => {

  const obj = {children: json};

  const format = (xs) => xs.map(x => pad(x, 4)).join('.');
  const pad = (x, w) => (10 ** w + x).toString().slice(-w);

  const renumber = (obj, path) => {
    obj.path = path;
    obj.sortOrder = format(path);
    obj.children.slice()
      .sort((obj1, obj2) => obj1.sortNr - obj2.sortNr)
      .forEach((c, n) => renumber(c, path.concat(n+1)));
  };

  renumber(obj, []);
};

indexJson(json);

console.log(JSON.stringify(json, null, 2));
0 голосов
/ 20 ноября 2018

В основном

let renumber = (obj, path) => {
    obj.path = path
    obj.children.forEach((c, n) => renumber(c, path.concat(n)))
}

renumber({children: yourData}, [])

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

obj.path = format(path)

, где format похоже на

let format = xs => xs.map(pad(4)).join(',')

let pad = w => x => (10 ** w + x).toString().slice(-w)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...