предисловие
В нашей работе мы часто можем столкнуться с требованиями бесконечных уровней классификации и т. д. Часто структура данных, возвращаемая бэкендом, может быть не той структурой данных, которую мы хотим, поэтому давайте посмотрим, как с этим бороться.
Преобразование плоской структуры данных в древовидную структуру 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},
]
Эпилог
Используя приведенный выше код, мы можем легко преобразовать эти две структуры данных~ Если у больших парней есть лучший способ, я надеюсь, они смогут отправить его для обсуждения~