Actually for this you do not need forkJoin() and switch() .
In general, you want to update each user in the user array with another asynchronous call.
I would do it like this:
var source = findUser('term') .mergeAll() .mergeMap(user => getLastLogin(user.user_id) .map(last_login => { user.last_login = last_login; return user; }) ) .toArray(); source.subscribe(val => console.log(val));
The mergeAll() operator converts an observable higher order into single observables. In this case, it takes an array of all users and re-selects them one by one. Then mergeMap() emits users updated with the last_login date. In the end, I used toArray() to convert single users into one large array that emits them as a whole (you can remove this operator if you want to emit single users).
Note that when you used return users.map(...) , you used Array.map() , which returns an array, not map() from RxJS, which returns Observable. I think that working with single objects is usually simpler than with arrays of objects.
See demo version: https://jsbin.com/naqudun/edit?js,console
Sent to the console:
[ { name: 'foo', user_id: 42, last_login: 2016-11-06T10:28:29.314Z }, { name: 'bar', user_id: 21, last_login: 2016-11-06T10:28:29.316Z } ]
source share