Сортировка массива объектов JS
Всем привет! Всё никак не могу отсортировать правильно массив. Нужно отсортировать следующий массив:
const arr = [
{id: 3123124, parentId: 0o0000, title: 'title', type: 'block'},
{id: 3542132, parentId: 3123124, title: 'title', type: 'child'},
{id: 12345, parentId: 88888, title: 'title', type: 'block'},
{id: 24124, parentId: 12345, title: 'title', type: 'child'},
{id: 99999, parentId: 45324, title: 'title', type: 'child'},
{id: 986648, parentId: 3123124, title: 'title', type: 'block'},
{id: 77777, parentId: 88888, title: 'title', type: 'child'},
{id: 54232, parentId: 3123124, title: 'title', type: 'child'},
{id: 54308, parentId: 15075, title: 'title', type: 'child'},
{id: 66666, parentId: 88888, title: 'title', type: 'block'},
{id: 56445, parentId: 12345, title: 'title', type: 'child'},
{id: 88888, parentId: 45324, title: 'title', type: 'block'},
{id: 15075, parentId: 12345, title: 'title', type: 'block'},
{id: 84356, parentId: 66666, title: 'title', type: 'child'},
{id: 45324, parentId: 0o0000, title: 'title', type: 'block'},
]
const newArr = [
{id: 3123124, parentId: 0o0000, title: 'title', type: 'block'},
{id: 3542132, parentId: 3123124, title: 'title', type: 'child'},
{id: 54232, parentId: 3123124, title: 'title', type: 'child'},
{id: 986648, parentId: 3123124, title: 'title', type: 'block'},
{id: 45324, parentId: 0o0000, title: 'title', type: 'block'},
{id: 99999, parentId: 45324, title: 'title', type: 'child'},
{id: 88888, parentId: 45324, title: 'title', type: 'block'},
{id: 77777, parentId: 88888, title: 'title', type: 'child'},
{id: 12345, parentId: 88888, title: 'title', type: 'block'},
{id: 56445, parentId: 12345, title: 'title', type: 'child'},
{id: 24124, parentId: 12345, title: 'title', type: 'child'},
{id: 15075, parentId: 12345, title: 'title', type: 'block'},
{id: 54308, parentId: 15075, title: 'title', type: 'child'},
{id: 66666, parentId: 88888, title: 'title', type: 'block'},
{id: 84356, parentId: 66666, title: 'title', type: 'child'},
]
- arr - массив, который надо отсортировать
- newArr - массив, который должен получиться
Чтобы самые верхние элементы были, у которых parentId: 0o000, а самые нижние их дети, у которых совпадает id c parentId и так далее, элементов может быть сколько угодно
Если parentId одинаковый у нескольких элементов, то идёт сначала child, самый последний block и его дети ниже, если они есть.
Ответы (1 шт):
Автор решения: ksa
→ Ссылка
порядок child не важен, главное чтобы block был главный, под ним идут его дети, потом идёт следующий блок, под которым уже его дети и т.д. лучше плоский
Могу предложить такой вариант преобразования массива...
const arr = [
{id: 3123124, parentId: 0o0000, title: 'title', type: 'block'},
{id: 3542132, parentId: 3123124, title: 'title', type: 'child'},
{id: 12345, parentId: 88888, title: 'title', type: 'block'},
{id: 24124, parentId: 12345, title: 'title', type: 'child'},
{id: 99999, parentId: 45324, title: 'title', type: 'child'},
{id: 986648, parentId: 3123124, title: 'title', type: 'block'},
{id: 77777, parentId: 88888, title: 'title', type: 'child'},
{id: 54232, parentId: 3123124, title: 'title', type: 'child'},
{id: 54308, parentId: 15075, title: 'title', type: 'child'},
{id: 66666, parentId: 88888, title: 'title', type: 'block'},
{id: 56445, parentId: 12345, title: 'title', type: 'child'},
{id: 88888, parentId: 45324, title: 'title', type: 'block'},
{id: 15075, parentId: 12345, title: 'title', type: 'block'},
{id: 84356, parentId: 66666, title: 'title', type: 'child'},
{id: 45324, parentId: 0o0000, title: 'title', type: 'block'},
]
const a = test(arr, 0o0000)
console.log(a)
//
function test(arr, prn) {
return arr.filter(o => o.parentId === prn).reduce((a, o) => {
a.push(o)
a.push(...test(arr, o.id))
return a
}, [])
}