Преобразование плоского массива в древовидную структуру JSON

JavaScript

предисловие

В нашей работе мы часто можем столкнуться с требованиями бесконечных уровней классификации и т. д. Часто структура данных, возвращаемая бэкендом, может быть не той структурой данных, которую мы хотим, поэтому давайте посмотрим, как с этим бороться.

Преобразование плоской структуры данных в древовидную структуру JSON

let flatArr = [
  {id: 1, title: "解忧杂货铺1", parent_id: 0},
  {id: 2, title: '解忧杂货铺2', parent_id: 0},
  {id: 3, title: '解忧杂货铺2-1', parent_id: 2},
  {id: 4, title: '解忧杂货铺3-1', parent_id: 3},
  {id: 5, title: '解忧杂货铺4-1', parent_id: 4},
  {id: 6, title: '解忧杂货铺2-2', parent_id: 2},
]

код

function convert(list) {
  const res = [];
  const map = list.reduce((res, v) => (res[v.id] = v, res), {});
  for (const item of list) {
    if (item.parent_id === 0) {
      res.push(item);
      continue;
    }
    if (item.parent_id in map) {
      const parent = map[item.parent_id];
      parent.children = parent.children || [];
      parent.children.push(item);
    }
  }
  return res;
}
let returnTree = convert(flatArr);
console.log(returnTree);

выходной результат

let JsonTree = [
{id: 1, title: '解忧杂货铺1', pid: 0},
  {
    id: 2, title: '解忧杂货铺2', pid: 0, children: [
      {id: 6, title: '解忧杂货铺4-2', pid: 2},
      {
        id: 3, title: '解忧杂货铺2-1', pid: 2, children: [
          {
            id: 4, title: '解忧杂货铺3-1', pid: 3, children: [
              {id: 5, title: '解忧杂货铺4-1', pid: 4},
            ]
          },
        ]
      },
    ]
  }
];

Плоская структура преобразования древовидной структуры JSON

Мы видим, что выше уже есть преобразованная древовидная структура JSON, так как же нам вернуть ее обратно?

код

function flatten(data) {
  return data.reduce((arr, {id, title, pid, children = []}) =>
    arr.concat([{id, title, pid}], flatten(children)), []);
}
let flatArr = flatten(JsonTree);
console.log(flatArr)

выходной результат

[
  {id: 1, title: '解忧杂货铺1', pid: 0},
  {id: 2, title: '解忧杂货铺2', pid: 0},
  {id: 3, title: '解忧杂货铺2-1', pid: 2},
  {id: 4, title: '解忧杂货铺3-1', pid: 3},
  {id: 5, title: '解忧杂货铺4-1', pid: 4},
  {id: 6, title: '解忧杂货铺4-2', pid: 2},
]

Эпилог

Используя приведенный выше код, мы можем легко преобразовать эти две структуры данных~ Если у больших парней есть лучший способ, я надеюсь, они смогут отправить его для обсуждения~