Сопоставить массив JSON с массивом объектов - PullRequest
0 голосов
/ 24 апреля 2020

Я тестирую с макетом данных JSON этого формата:

   [
        {
            "_id": "5ea1c3e2f376f7887032bd44",
            "iso6393": "ara",
            "name": "Arabic"
        },
        {
            "_id": "5ea1c3e2f376f7887032bd41",
            "iso6393": "eng",
            "name": "English"
        }
    ]

Мой Angular код вводит его в массив Language[]. Я могу получить доступ к объекту и получить сведения об этом объекте в моей среде IDE и сбое предварительной трансплантации:

getLanguages(): Promise<Language[]> {
    const url = this.cfgSvc.composeURL(SettingsEnum.LANGS);
    return this.http.get<Language[]>(url).toPromise();
  }

Теперь веб-служба изменилась и обернула JSON в родительский узел "languages":

{
    "languages": [
        {
            "_id": "5ea1c3e2f376f7887032bd44",
            "iso6393": "ara",
            "name": "Arabic"
        },
        {
            "_id": "5ea1c3e2f376f7887032bd41",
            "iso6393": "eng",
            "name": "English"
        }
    ]
}

Однако, это больше не будет работать с моим кодом. Как я могу удалить родительский узел languages и снова отобразить элементы в массив Language[]?

Мне не удалось реализовать его с помощью pipe и map. И я не хочу делать это с подробным кодом и конструкторами объекта Language.

1 Ответ

1 голос
/ 24 апреля 2020

Я хотел бы поделиться полным решением, которым руководил @jonrsharpe. Спасибо. Я не знал о разрушении. Теперь это будет частью моего ежедневного использования!

getLanguages(): Promise<Language[]> {
    const url = this.cfgSvc.composeURL(SettingsEnum.LANGS);
    return this.http.get<Languages>(url).toPromise().then(
      {languages} => languages);
  }

Функция стрелки в then получает результат запроса get (тело ответа). Поскольку это заданная переменная, можно извлечь из нее все, что вы захотите, и назначить ее переменной после жирной стрелки. В моем случае я хочу извлечь каждый узел language без узла root languages.

({languages}) => languages

Удивительно лаконично. Это также может быть записано многословно.

({languages: langs}) => { 
     return langs
}

Что приводит к извлечению родительского узла languages из ответа json, что влечет за собой просто массив Language s. Другими словами, я принимаю только значение узла languages.

Вот почему мне не нужно менять Promise<Language[]> обобщение сигнатуры метода. Однако - как правильно указал @jonrsharpe - необходимо установить получающие генерики http.get в Languages для представления входящей структуры.

Разрушение ... удивительно. Вот solid учебник об этой новой функции: https://www.youtube.com/watch?v=NIq3qLaHCIs

...