javascript - How to get first element from observable and return an observable for the rest of the stream? -
i'm trying write observable return objects csv file. problem want use header of file, use property names next elements of observer. example, if have csv:
symbol;word 1;one 2;two 3;three i want happen:
getobjects().subscribe(o => console.log(o)); // should log this: { symbol: '1', word: 'one' } { symbol: '2', word: 'two' } { symbol: '3', word: 'three' } i managed this code:
const rx = require('rxjs/rx'); const _zipobject = require('lodash/zipobject'); const getobjects = () => { const observable = rx.observable.of( ['symbol', 'word'], ['1', 'one'], ['2', 'two'], ['3', 'three'] ).share(); let header; return rx.observable.concat( observable.first().do(line => header = line).filter(() => false), observable.skip(1).map(line => _zipobject(header, line)) ); }; getobjects().subscribe(o => console.log(o)); it works, doesn't feel nice. thought using filter, filtering first element , setting header, wouldn't feel better, , have disadvantage of having filter callback being called every element.
you can use combinelatest header , date @ same time , avoid accessing parent scope:
const rx = require('rxjs/rx'); const observable = rx.observable; const getobjects = () => { const observable = observable.of( ['symbol', 'word'], ['1', 'one'], ['2', 'two'], ['3', 'three'] ).share(); const header$ = observable.take(1); const data$ = observable.skip(1); return observable.combinelatest(header$, data$, (headers, line) => { const result = {}; headers.foreach((header, i) => { result[header] = line[i]; }); return result; }); }; getobjects().subscribe(o => console.log(o)); this prints:
{ symbol: '1', word: 'one' } { symbol: '2', word: 'two' } { symbol: '3', word: 'three' }
Comments
Post a Comment