#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 bymap()
. На самом деле я думаю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); })