Изменить вложенные наблюдаемые значения
return this.http.get(environment.remoteUrl + '/client').pipe(pluck('rows'), map((i: any) => i.doc));
Я получаю данные в следующей структуре:
{
rows: [
{x: 123, doc: {a: 2}},
{x:222, doc: {a: 1}}
],
c: 'hello',
b: 3
}
Я только верну подписчику оба документа под строками.
Но, похоже, функция карты не сработала, как я ожидал, потому что возвращается undefined.
Я жду [ {a: 2}, {a: 1} ]
Я нашел решение:
.pipe(pluck('rows'), flatMap((i: any) => i), map((i: any) => i.doc), toArray());
Но надеюсь, что есть более короткий путь!?
1 ответ
pluck('rows'),
Это преобразует каждое испущенное событие в его свойство rows. Так что излучает
[
{x: 123, doc: {a: 2}},
{x:222, doc: {a: 1}}
]
Теперь вы хотите преобразовать этот массив в другой массив, содержащий только
[ {a: 2}, {a: 1} ]
Так что вам нужно map
оператор, и этот оператор карты должен преобразовать массив в другой массив. Это можно сделать с помощью Array.map()
:
map(arrayOfXAndDocs => arrayOfXAndDocs.map(xAndDoc => xAndDoc.doc))
Определение типов для ваших структур и использование их вместо использования any
и используя понятные имена, а не i
, очень помогает.
Обратите внимание, что отрыв, за которым следует карта, может быть сведен к одной операции:
map(objectWithRows => objectWithRows.rows.map(xAndDoc => xAndDoc.doc))
Это позволяет избежать уродливых pluck()
оператор, который не является типобезопасным.