我正在学习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
答案 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