2017-08-07 47 views
2

嵌套數組使用RxJs可觀察到中流的格式如下:附加參數從Obervable

{ 
    term: 'one', 
    sources: [ 
     { 
     name: 'google' 
     }, 
     { 
     name: 'yahoo' 
     } 
    ] 
} 

我希望把它變成格式:

{ 
    sources: [ 
     { 
     name: 'google', 
     id: 'one' 
     }, 
     { 
     name: 'yahoo', 
     id: 'one' 
     } 
    ] 
} 

所以我喜歡將該術語追加到sources數組中的每個元素上。 最後,我真的很喜歡他們的發射正確格式化的數組元素。 我猜這是用mergeMap來發射每個數組el的事件,但我掙扎!

RxJs v5.4.2

回答

1

你是正確的,你可以使用mergeMap/flatMap實現這一目標。 然後使用.from()一次發送一個源。

let data = { 
    term: 'one', 
    sources: [ 
     { 
      name: 'google' 
     }, 
     { 
      name: 'yahoo' 
     } 
    ] 
}; 

let obs$ = Observable.of(data) // mimicking whatever your observable sequence is 
    .flatMap(res => { 
     // assign id to each item in sources array 
     res.sources.forEach(item => { 
      item.id = res.term; 
     }); 

     return Observable.from(res.sources); 
    }); 

obs$.subscribe(res => { 
    console.log('subscribe result', res); 
}); 

// output is 
// subscribe result {name: 'google', id: 'one'} 
// subscribe result {name: 'yahoo', id: 'one} 
+1

偉大的東西,謝謝! 由於版本RxJs 只是不得不將flatMap更改爲mergeMap,但工作了一種享受。 – librsean

1

您可以使用concatMap轉換的扁平化Observablemap創建一個新的可觀測與nameterm財產的關鍵。

var dataLists = Rx.Observable.from([{ 
 
    term: 'one', 
 
    sources: [ 
 
     { 
 
     name: 'google' 
 
     }, 
 
     { 
 
     name: 'yahoo' 
 
     } 
 
    ] 
 
}]); 
 

 

 
dataLists = dataLists.concatMap(function(dataList) { 
 
    return dataList.sources.map(function(source){ 
 
    source.term = dataList.term; 
 
    return source; 
 
    }) 
 
}); 
 

 
dataLists.forEach(function(dataList){ 
 
    console.log(dataList); 
 
})
<script src="https://unpkg.com/@reactivex/[email protected]/dist/global/Rx.js"></script>