将参数附加到Obervable的嵌套数组

时间:2017-08-07 15:53:31

标签: angular rxjs observable ngrx

使用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

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转换展平Observablemap以创建一个新的Observable,其nameterm作为属性键。

&#13;
&#13;
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;
&#13;
&#13;