RXjs - flatMap然后"合并"它再次

时间:2017-03-13 18:19:30

标签: javascript angular rxjs

我正在学习RXjs,我想了解事情是如何运作的。这就是为什么我设想了我制作Observable.of并传入数组的场景的原因。我知道,Observable.from会更合适,但我会学习如何运作。

所以,这是我的代码:

let sourceZero = Rx.Observable
                    .of([{name: 'James', age: 25}, {name: 'Angelina', age: 30}]);

sourceZero.subscribe(
  x =>  console.log(x)
);

这可以按预期工作:订阅的值是数组。

好的,现在我想过滤那个数组。虽然我知道我还可以做很多其他选择,例如在代码的订阅部分,我想在创建observable时过滤它。所以,我使用flatMap,就像这样。

let source = Rx.Observable
              .of([{name: 'James', age: 25}, {name: 'Angelina', age: 30}])
              .flatMap(x => x)
              .filter(x => x.age > 15)

虽然这样做了我想要的,但结果不再是数组,而是一个对象流。

现在,我的问题是,如何再次从这个过滤后的数据中制作数组?我不想将单个对象传递给订阅部分,而是将数组传递给第一个示例中的情况。

所以,目前的结果是:

[object Object] {
  age: 25,
  name: "James"
}
[object Object] {
  age: 30,
  name: "Angelina"
}

但我希望它是:

[[object Object] {
  age: 25,
  name: "James"
}, [object Object] {
  age: 30,
  name: "Angelina"
}]

基本上,我正在寻找一种方法来反转flatMap。我使用.concatMap(x => Rx.Observable.of(x))无济于事。

代码可在此处找到:http://jsbin.com/lujeqowofi/1/edit

3 个答案:

答案 0 :(得分:2)

List<ExpressionStatementSyntax or InvocationExpressionSyntax> {CallMethod1, CallMethod2, CallMethod4, CallMethod5, CallMethod3} 运算符是您正在寻找的:

Reduce

答案 1 :(得分:1)

我认为你误解了RxJS的含义。也许如果我引导您完成代码的工作,您就会看到自己的错误。

let source = Rx.Observable
              .of([{name: 'James', age: 25}, {name: 'Angelina', age: 30}])  // 1.
              .flatMap(x => x)  // 2. 
              .filter(x => x.age > 15)  // 3.

Observable的关键抽象是它随着时间的推移而成为一个价值流​​&#34;。我们的意思是,observable发出单个值,一次一个值。发出的值可能是复杂的对象甚至是数组,但它们仍然是单个值。

在你的代码中,当你说Observable.of()(第1步)时,你创建了一个只能发出单个值的observable:你的数组。

然后,当你进行flatMapped(第2步)时,你做了一件我认为你不应该做的事。 flatMap运算符用于处理Observable,它将Observables作为其值。但是,在您的步骤2中,您的原始可观察量不会发出可观察量,它会发出一个阵列。但是,flatMap能够将一个数组转换为一个可观察的数据,以便它能做到这一点。

但是在这一点上,你现在有一个可以发出2个值的可观察量:第一个 - &gt; {name: 'James', age:25 }然后 - &gt; {name: 'Angelina', age: 30}。此时,您的observable不再处理数组。它处理单个对象。

如果您的目的只是过滤原始数组,只包含年龄> gt的项目。 15,然后在阵列上使用地图。

答案 2 :(得分:0)

要添加到@Serginho的答案,使用空数组作为const toArray = reduce((acc, x) => { acc.push(x); return acc; }, Array<any>()); (第一个值)可​​能更干净

awk '(NR>1) && ($29 <= 0.05 ) ' Stomach.v7.egenes.txt > Stomach.v7.egenes.txtE