Изменить вложенные наблюдаемые значения

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() оператор, который не является типобезопасным.

Другие вопросы по тегам