如何使用Rxjs在一个列表中合并两个对象列表

时间:2018-12-27 15:57:09

标签: rxjs reactive-programming

我有2个不同的对象列表,我想将它们组合在一起例如:

listObj1 = [{name:'bob 1'}, {name:'bob 2'}]
listObj2 = [{pseudo:'Bob Razowski'}, {pseudo:'sponge bob'}]

result = [
   {name:'bob 1', pseudo:'Bob Razowski}
   {name:'bob 2', pseudo:'sponge bob'}
]

我可以使用rxjs做到这一点吗,以及如何或是否有更好的解决方案让我知道

const characters = [];
const name$ = Observable.from(this.nameList)
                    .map(item => {
                        return {'name': item};
                    })

const pseudo$ = Observable.from(this.pseudoList)
                    .map(item => {
                        return {'pseudo': item};
                    })
Observable.zip(name$, pseudo$).subscribe(result => {
                        let char= {};
                        if(result.length > 1) {
                            char['name'] = result[0];
                            char['pseudo'] = result[1];
                            characters.push(char)
                        }
                    });              

我开始了类似的事情,但是当我看到结果时,无需rxjs就可以做到。我的问题是,是否存在其他运算符来执行此操作。

谢谢

1 个答案:

答案 0 :(得分:2)

好吧,您可以使用RxJS进行此操作,但是没有明显的理由这样做,请查看您的代码段。做出反应的原因之一是您的列表确实很长,并且希望让组合发生在(假设的)多个线程上。但是在JavaScript中这并不实际,因此for...ofArray.map是执行此类任务的正确选择。

无论如何,RxJS解决方案将如下所示:

zip(
    from(listOb1),
    from(listObj2)
).pipe(
    map(([one, two]) => Object.assign({}, one, two)),
    toArray()
)

使用from将两个列表转换为可观察流,然后zip将它们一起使用map将每一对Object.assign转换为新对象。用toArray收集对象并完成操作。