Сортировать массив объектов с вложенными потомками в Angular (7) - PullRequest
0 голосов
/ 31 января 2020

Я пытался отсортировать базу полезных данных ответа по полю объекта «sortOrderNumber», в котором содержится внутренний дочерний элемент.

Полезная нагрузка ответа:

{   
    "content":
    [ 
        {
            "eserviceSettings":[ 
            { 
               "serviceName":"Licenses",
               "sortOrderNumber":5,
               "eserviceSettings":[ 
                  { 
                     "serviceName":"Manning Licenses",
                     "sortOrderNumber":2,
                     "eserviceSettings":[ 
                        { 
                           "serviceName":"Enquiry on Application Status",
                           "sortOrderNumber":2,
                           "eserviceSettings":[ 
                           ]
                        },
                        { 
                           "serviceName":"Enquiry of Manning Licence and Submission",
                           "sortOrderNumber":1,
                           "eserviceSettings":[ 
                           ]
                        }
                     ]
                  },
                  { 
                     "serviceName":"Craft Licenses",
                     "sortOrderNumber":1,
                     "eserviceSettings":[ 
                        { 
                           "serviceName":"Application for New Harbour Craft Licence",
                           "sortOrderNumber":2,
                           "eserviceSettings":[ 
                           ]
                        },
                        { 
                           "serviceName":"Application for New Pleasure Craft Licence",
                           "sortOrderNumber":1,
                           "eserviceSettings":[ 
                           ]
                        }
                     ]
                  },
                  { 
                     "serviceName":"Craft Inspection Booking",
                     "sortOrderNumber":5,
                     "eserviceSettings":[ 
                     ]
                  }
               ]
            }
            ]
        }
    ]
}

Я пытался использовать приведенный ниже код

const childEservices = content[0].eserviceSettings;
this.postLoginDashboardData = allObjs.concat(childEservices);
this.postLoginDashboardData.sort((a: any, b: any) =>  a.sortOrderNumber - b.sortOrderNumber);
      this.postLoginDashboardData.forEach( (element) => {
        element.eserviceSettings.sort((a: any, b: any) =>  a.sortOrderNumber - b.sortOrderNumber);
      });

Результат после сортировки ниже, где внутренние потомки не сортируются. Не уверен, где мне не хватает.

{   
        "content":
        [ 
            {
                "eserviceSettings":[ 
                { 
                   "serviceName":"Licenses",
                   "sortOrderNumber":5,
                   "eserviceSettings":[
                    { 
                         "serviceName":"Craft Licenses",
                         "sortOrderNumber":1,
                         "eserviceSettings":[ 
                            { 
                               "serviceName":"Application for New Harbour Craft Licence",
                               "sortOrderNumber":2,
                               "eserviceSettings":[ 
                               ]
                            },
                            { 
                               "serviceName":"Application for New Pleasure Craft Licence",
                               "sortOrderNumber":1,
                               "eserviceSettings":[ 
                               ]
                            }
                         ]
                      },
                      { 
                         "serviceName":"Manning Licenses",
                         "sortOrderNumber":2,
                         "eserviceSettings":[ 
                            { 
                               "serviceName":"Enquiry on Application Status",
                               "sortOrderNumber":2,
                               "eserviceSettings":[ 
                               ]
                            },
                            { 
                               "serviceName":"Enquiry of Manning Licence and Submission",
                               "sortOrderNumber":1,
                               "eserviceSettings":[ 
                               ]
                            }
                         ]
                      }
                      ,
                      { 
                         "serviceName":"Craft Inspection Booking",
                         "sortOrderNumber":5,
                         "eserviceSettings":[ 
                         ]
                      }
                   ]
                }
                ]
            }
        ]
    }

Любая помощь для лучшей сортировки с минимальным код. Результат, который я пытался получить, ниже

{   
    "content":
    [ 
        {
            "eserviceSettings":[ 
            { 
               "serviceName":"Licenses",
               "sortOrderNumber":5,
               "eserviceSettings":[
                { 
                     "serviceName":"Craft Licenses",
                     "sortOrderNumber":1,
                     "eserviceSettings":[ 
                        { 
                           "serviceName":"Application for New Pleasure Craft Licence",
                           **"sortOrderNumber":1,**
                           "eserviceSettings":[ 
                           ]
                        },
                        { 
                           "serviceName":"Application for New Harbour Craft Licence",
                           **"sortOrderNumber":2,**
                           "eserviceSettings":[ 
                           ]
                        }
                     ]
                  },
                  { 
                     "serviceName":"Manning Licenses",
                     "sortOrderNumber":2,
                     "eserviceSettings":[
                        { 
                           "serviceName":"Enquiry of Manning Licence and Submission",
                           **"sortOrderNumber":1,**
                           "eserviceSettings":[ 
                           ]
                        },                       
                        { 
                           "serviceName":"Enquiry on Application Status",
                           **"sortOrderNumber":2,**
                           "eserviceSettings":[ 
                           ]
                        }
                     ]
                  },
                  ,
                  { 
                     "serviceName":"Craft Inspection Booking",
                     "sortOrderNumber":5,
                     "eserviceSettings":[ 
                     ]
                  }
               ]
            }
            ]
        }
    ]
}

Заранее спасибо.

1 Ответ

2 голосов
/ 31 января 2020

После сортировки в первый раз используйте следующее:

function sortRecursive(data) {
  if (data[0]) {
    data.forEach( (element) => {
      if (element.eserviceSettings) {
        element.eserviceSettings.sort((a, b) =>  a.sortOrderNumber - b.sortOrderNumber);
        sortRecursive(element.eserviceSettings);
      }
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...