【问题标题】:Equivalent of loop in a loop in rxjs相当于rxjs中循环中的循环
【发布时间】:2018-11-09 19:15:16
【问题描述】:

相当于什么

array.forEach(element => {
  array.forEach(element2 => {
    //do something with element and element2
  });
});

在 rxjs 中?

目前我是这样“解决”的

switchMap(array => from(array).pipe(
  tap(element => {
    array.forEach(element2 => {
      //do something with element and element2
    })
  })
)

let globalArray = [...someObjects];

of(globalArray).pipe(
  mergeMap(array => array),
  tap(element => {
    globalArray.forEach(element2 => {
      //do something with element and element2
    })
  })
)

(在实际代码中globalArray是一个传递给函数的数组)

但这在 rxjs 中感觉不是正确的方法。

【问题讨论】:

  • 你的第二个例子有点奇怪。来自mergeMaparray 变量不在tap 函数的范围内。而这个 mergeMap 仅在 array 实际上是数组的可观察对象时才有效,这将要求主题是数组可观察对象的可观察对象。
  • 你是对的。当我为 SO 简化第二个示例时,第二个示例出错了。
  • 没有等价物,因为这与 rxjs 无关。

标签: rxjs


【解决方案1】:

如果我正确理解您的问题,mergeMap 就是您要找的接线员。

mergeMap 需要一个返回 ObservableInput 的函数作为其第一个参数。数组是一个 ObservableInput。当返回一个 Array 时,mergeMap 将 Array 展平并将每个 Item 作为单独的通知发出。

所以下面的代码应该做你正在寻找的东西

of(arrayOfArraysOfNumbers)
.pipe(
  mergeMap(arrayOfArrays => arrayOfArrays),
  mergeMap(array => array)
)
.subscribe(console.log)

这里是example

更新 - 相同的数组循环两次

如果你必须循环同一个数组两次,你可能会看到这样的东西

function closureForArray(arrayOfElements: Array<any>) {
  return from(arrayOfElements).pipe(
    mergeMap(e1 => from(arrayOfElements).pipe(
      map(e2 => ({e1, e2}))
    ))
  )
}

of(arrayOfElements)
.pipe(
  switchMap(closureForArray),
  map(({e1, e2}) => // do something with e1 and e2)
)

这里的基本思想是closureForArray 函数将arrayOfElements 保持在范围内,因此可以应用from RxJS 函数两次,一次运行第一个循环,另一个从第一个循环中运行第二个循环循环。

这里是updated example

【讨论】:

  • 不,那不是我想要的。我希望同一个数组循环两次并组合元素。就像一个矩阵,元素在对角线上撞击自身。在我最初的问题中,array 是同一个数组。
猜你喜欢
  • 2023-03-06
  • 2021-04-02
  • 1970-01-01
  • 2021-10-08
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2011-06-04
相关资源
最近更新 更多