Сортировка массива объектов 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
  }, [])
}

→ Ссылка