2017-08-18 62 views
0

我想寫一個Observable來從類似CSV文件的東西中返回對象。我的問題是我想使用該文件的標題,將其用作Observer的下一個元素的屬性名稱。舉例來說,如果我有這樣的CSV:如何從observable獲取第一個元素並返回該流的其餘部分的可觀察值?

symbol;word 
1;one 
2;two 
3;three 

我希望這種情況發生:

getObjects().subscribe(o => console.log(o)); 

// should log this: 
{ symbol: '1', word: 'one' } 
{ symbol: '2', word: 'two' } 
{ symbol: '3', word: 'three' } 

我設法與此代碼做到這一點:

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)); 

它的工作原理,但沒有按感覺不錯。我還想過使用過濾器來過濾第一個元素並設置頭文件,但它不會感覺好多了,並且會爲每個元素調用過濾器回調函數。

回答

1

您可以使用combineLatest來獲得,同時頭和日期,避免從父範圍訪問它:

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)); 

此打印:

{ symbol: '1', word: 'one' } 
{ symbol: '2', word: 'two' } 
{ symbol: '3', word: 'three' } 
+0

太好了!謝謝!! –

相關問題