使用RxJs Observable mid-stream具有以下格式:
{
term: 'one',
sources: [
{
name: 'google'
},
{
name: 'yahoo'
}
]
}
我希望将其转换为以下格式:
{
sources: [
{
name: 'google',
id: 'one'
},
{
name: 'yahoo',
id: 'one'
}
]
}
所以我想将这个术语附加到sources数组中的每个元素上。 最后,我真的很喜欢在它们上面发出的格式正确的数组元素。 我猜测它与mergeMap有关,为每个阵列发出一个事件,但我正在努力!。
RxJs v5.4.2
答案 0 :(得分:1)
你是对的,你可以使用mergeMap / flatMap来实现这一目标。 然后使用.from()一次发出一个源。
# Speed Benchmarks
library(data.table)
library(microbenchmark)
dt <- data.table(x)
frank <- function(DT, n = 15) {
DT[, xc := cumsum(x)]
b = DT[.(shift(xc, fill=0) + n + 1), on=.(xc), roll=-Inf, which=TRUE]
z = 1; res = z
while (!is.na(z))
res <- c(res, z <- b[z])
DT[, g := cumsum(.I %in% res)][]
}
microbenchmark(
frank(dt),
sotosGroup(x, 15),
times = 100
)
#> Unit: microseconds
#> expr min lq mean median uq max neval cld
#> frank(dt) 1720.589 1831.320 2148.83096 1878.0725 1981.576 13728.830 100 b
#> sotosGroup(x, 15) 2.595 3.962 6.47038 7.5035 8.290 11.579 100 a
答案 1 :(得分:1)
您可以使用concatMap
转换展平Observable
和map
以创建一个新的Observable,其name
和term
作为属性键。
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);
})
&#13;
<script src="https://unpkg.com/@reactivex/rxjs@5.0.3/dist/global/Rx.js"></script>
&#13;