0

我正在尝试找到最干净的解决方案来使用filter()运算符来过滤我的观察值。

在这里,我正在复制服务调用以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);
     } }

联系人列表

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

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

我如何过滤联系人并将其分配给maleListfemaleList使用RxJS filter()运算符。

提前致谢

4

3 回答 3

2

您不需要过滤器:

this._contactService.getContacts()
  .subscribe(person => {
    if(person.gender === 'F'){
      this.femaleList.push(person);
    } else {
      this.maleList.push(person);
    }
于 2016-12-13T12:56:59.923 回答
1

如果你想使用单个 Observable 并使用两个不同的 Observers 订阅它,你需要使用share()or shareReplay()(在 RxJS 5 中现在只能使用.publishReplay().refCount())(参见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)。

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);

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

这将打印到控制台:

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

这两个订阅者共享相同的连接,source同时响应被“重播”(如果您在它第一次发出后订阅,它将重新发送而无需source再次订阅)。

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

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

于 2016-12-13T13:13:45.460 回答
0

你可以使用 lodash:

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

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

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

于 2018-04-26T08:56:52.600 回答