Преобразование ответа службы http в Angular с помощью rxjs

#angular #typescript #rxjs

#angular #typescript #rxjs

Вопрос:

Вот пример использования :

  • Я вызываю один http-метод, который возвращает мне идентификатор.
  • Передача вышеуказанного идентификатора для получения массива ответа объекта.

ответ :

 [
   {
      "cuisp":"17296744",
      "instr_type":"Common Stock (CS)",
      "isConversion":"No",
      "issue_date":"04/31/2020",
      "rev_rule":"common equity tier 1",
      "isCumulative":"Noncumulative",
      "notional_amt":"8434.695",
      "amt_transacted":"8434.695",
      "isPerpetual":"Perpetual",
      "isFixed":"Floating"
   }, ...
]
  

Теперь я хочу добавить isEditable : false к каждому объекту внутри этого ответа.
Я попробовал приведенный ниже код.

 this._httpservice.getTemplateForVersion(this.selected_template).pipe(
      concatMap((res: any) => {
        return this._httpservice.getTemplateJsonData(res.id).pipe(
          mergeAll(),
          map((d: any) => {
            d['isEditable'] = false;
            return d;
          })
        );
      })
    ).subscribe(res => {
      console.log(res);
    })
  

однако это просто обновление первого элемента ответа.
Мне нужен окончательный ответ, который должен быть

 [
       {
          "cuisp":"17296744",
          "instr_type":"Common Stock (CS)",
          "isConversion":"No",
          "issue_date":"04/31/2020",
          "rev_rule":"common equity tier 1",
          "isCumulative":"Noncumulative",
          "notional_amt":"8434.695",
          "amt_transacted":"8434.695",
          "isPerpetual":"Perpetual",
          "isFixed":"Floating",
          "isEditable":false,
       }, ...
    ]
  

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

Комментарии:

1. Может быть: return { ...d, isEditable: false}; ?

2. это то же самое, что и я…

3. это то же самое, что я сделал ? Что это значит?

4. d['isEditable'] = false;return d; это то же самое, что и в приведенном выше распространении .. также попробовано по предложению ur.. не повезло

5. Возможно, это не решит вашу проблему, но может быть проще понять, что происходит, если вы замените mergeAll() и map() на mergeMap()

Ответ №1:

Оператор сопоставления RxJS позволяет изменять поток, но сама модификация должна выполняться внутри функции:

 map((d: any) => {
    return d.map(item => ({...item, isEditable: false}));        
})
  

Комментарии:

1. Это правильно. @user1608841, вам не нужен mergeAll() оператор. Просто используйте concatMap() followed by map() . На самом деле я думаю switchMap , что это более уместно, но, вероятно, это не имеет значения, потому что http-вызовы в любом случае генерируются только один раз. Итак, в целом: this._httpservice.getTemplateForVersion(this.selected_template).pipe( switchMap(res => this._httpservice.getTemplateJsonData(res.id)), map((d:any[]) => d.map(item => {...item, isEditable: false})) ).subscribe(res => { console.log(res); })