代码之家  ›  专栏  ›  技术社区  ›  fastr.de

rxjs中循环中循环的等价物

  •  -2
  • fastr.de  · 技术社区  · 7 年前

    什么是等价物

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

    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中,这样做感觉并不正确。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Picci    7 年前

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

    合并地图 合并地图 展平阵列并将每个项目作为单独的通知发出。

    因此,下面的代码应该满足您的要求

    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

    updated example .