RxJS filter()运算符

时间:2016-12-13 12:52:25

标签: angular rxjs angular2-services rxjs5 rxjs-dom

我正在尝试找到使用filter()运算符的最干净的解决方案,以便过滤我的observable。

我在这里复制服务电话以分别获得femaleList

export class MyComp implements OnInit {

    maleList: IContact[] = [];
    femaleList: IContact[] = [];    

    constructor(private _contactService: ContactService) { }
    ngOnInit() : void {
        this._contactService.getContacts()
         .filter(male => male.gender === 'M')
        subscribe(maleList => this.maleList = maleList);

        this._contactService.getContacts()
         .filter(female => female.gender === 'F')
        subscribe(femaleList => this.femaleList = femaleList);
     } }

Contactlist

 [{
      "id" : 1,
      "name" : "Todd",
      "gender" : "M"
    }, {
      "id" : 2,
      "name" : "Lillian",
      "gender" : "F"
    }]

RxJS运算符中是否有任何选项可以使用单个observable分配给两个变量。

如何使用 RxJS maleList运算符过滤联系人并将其分配给femaleListfilter()

提前致谢

3 个答案:

答案 0 :(得分:2)

您不需要过滤器:

def afficherListe(A):
n=len(A)
B=[]
for i in range (0,n,1):
    for j in range (0,n,1):
        if i!=j:
            B.append(A[i][j])
return B

答案 1 :(得分:1)

如果您想使用单个Observable并使用两个不同的观察者订阅它,您需要使用share()shareReplay()(现在只有.publishReplay().refCount()才能使用let data = [{ "id" : 1, "name" : "Todd", "gender" : "M" }, { "id" : 2, "name" : "Lillian", "gender" : "F" }]; let maleList = []; let femaleList = []; let source = Observable.defer(() => { console.log('Observable.defer'); return Observable.from(data); }) .publishReplay() .refCount(); source .filter(male => male.gender === 'M') .toArray() .subscribe(list => maleList = list); source .filter(male => male.gender === 'F') .toArray() .subscribe(list => femaleList = list); console.log('maleList', maleList); console.log('femaleList', femaleList); 1}})(参见https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publish.mdhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md)。

Observable.defer
maleList [ { id: 1, name: 'Todd', gender: 'M' } ]
femaleList [ { id: 2, name: 'Lillian', gender: 'F' } ]

查看现场演示:https://jsbin.com/hapofu/edit?js,console

打印到控制台:

source

这两个订阅者都与source共享相同的连接,同时响应是#34;重播" (如果您在首次发布后进行订阅,则会重新发送而不再订阅filter())。

请注意,toArray()中的项目是一次发出的。这就是我使用maleList.push()收集所有值并将它们重新发送为单个数组的原因。或者我可以打电话给例如。每个值filter()

顺便说一句,您还可以使用partition()运算符代替insertOne()来避免创建两个订阅。

答案 2 :(得分:0)

你可以使用lodash:

.partition(collection,[predicate = .identity]);

https://lodash.com/docs/#partition

这将返回2个数组,其中一个值的值为false&另一个是真的。只需使用“性别”来构建评估。