A través de mi testData$ observable, recibo datos que se ven así:
[ { type: 'userInfo', data: [ { username: 'Sara', age: 27, }, { username: 'Max', age: 31, }, { username: 'Kim', age: 26, }, ], }, { type: 'cars', data: [ { type: 'Mercedes' }, ], }, ]; De testData$ quiero obtener la edad de Max y almacenarla en maxAge$ . He probado este código hasta ahora:
public maxAge$ = this.testData$.pipe( map(x => x.filter(obj => obj.type === 'userInfo')), map(value => value[0]), pluck('data'), );Devuelve la matriz de datos de esta manera:
[ { username: 'Sara', age: 27, }, { username: 'Max', age: 31, }, { username: 'Kim', age: 26, }, ] Pero ahora no sé cómo continuar desde aquí para obtener el valor de age de Max. En este caso, es importante no seleccionar solo el segundo elemento de la matriz de data porque el orden puede variar. ¿Que puedo hacer?
const users = [ { username: 'Sara', age: 27, }, { username: 'Max', age: 31, }, { username: 'Kim', age: 26, }, ] cons maxage = users.find(user=>user.username=='MAX').age; public maxAge$ = this.testData$.pipe( map(x => x.find(obj => obj.type === 'userInfo').data), map(users => users.find(user=>user.username==='Max').age) );Podría usar el operador de map RxJS con el método Array#find
const testData = [{ type: 'userInfo', data: [{ username: 'Sara', age: 27, }, { username: 'Max', age: 31, }, { username: 'Kim', age: 26, }, ], }, { type: 'cars', data: [{ type: 'Mercedes' }, ], }, ]; const maxAge = testData .find(item => item.type === 'userInfo') .data .find(item => item.username === 'Max') .age; console.log(maxAge);Así que la corriente se vería como
public maxAge$ = this.testData$.pipe( map((testData: any) => testData .find(item => item.type === 'userInfo') .data .find(item => item.username === 'Max') .age ) ); Si no sabe si las propiedades estarán siempre disponibles (lo que podría dar lugar a errores undefined ), puede utilizar el operador de encadenamiento opcional ?. .