合并嵌套可观察对象的结果
Combine results of nested observables
我在网上商店工作,我想检查商品是否已经在购物车中。我有两个需要完成这项工作的可观察对象:
1: 从数据库中取出所有项目
this.itemsService
.getAll()
.subscribe(
items => {
console.log(items); // [{...},{...},{...},...]
}
);
2:如果一个项目在购物车中出现了三次,这个函数将返回一个包含该项目三倍的数组的可观察对象。
public getItemFromCart(itemToGet) {
return this.cart$.map(cartItems => {
return cartItems.filter(
(item: ICartItem) => itemToGet.id === item.idItem
);
});
}
我现在想做的是获取所有商品,使用 getItemFromCart 检查每个商品是否存在于购物车中,如果存在,我需要设置 属性 item.inCart = true。否则应该是假的...
我只想使用一个订阅,不想嵌套订阅...
this.itemsService
.getAll()
// do something here to check if the item in the array is present in the cart
.subscribe(
items => {
console.log(items); // [{...},{...},{...},...]
}
);
提前致谢!
因为您同时拥有 items$
和 cart$
,您可能可以使用 combineLatest
或 zip
运算符,请执行以下操作:
import { of } from 'rxjs/observable/of';
import { zip } from 'rxjs/observable/zip';
import { combineLatest } from 'rxjs/observable/combineLatest';
// replace with your item service stream
const items$ = of([
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' }
]);
// replace with your cart stream
const cart$ = of([
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' }
]);
let result = [];
// use zip or combineLatest
combineLatest(items$, cart$)
.subscribe(([items, cartItem]) => {
result = items.map(item => ({
...item,
inCart: !!cartItem.find(x => x.id === item.id)
}));
// 1, 2, 3 incart = true, 4, 5 incart = false
console.log(result);
});
我在网上商店工作,我想检查商品是否已经在购物车中。我有两个需要完成这项工作的可观察对象:
1: 从数据库中取出所有项目
this.itemsService
.getAll()
.subscribe(
items => {
console.log(items); // [{...},{...},{...},...]
}
);
2:如果一个项目在购物车中出现了三次,这个函数将返回一个包含该项目三倍的数组的可观察对象。
public getItemFromCart(itemToGet) {
return this.cart$.map(cartItems => {
return cartItems.filter(
(item: ICartItem) => itemToGet.id === item.idItem
);
});
}
我现在想做的是获取所有商品,使用 getItemFromCart 检查每个商品是否存在于购物车中,如果存在,我需要设置 属性 item.inCart = true。否则应该是假的...
我只想使用一个订阅,不想嵌套订阅...
this.itemsService
.getAll()
// do something here to check if the item in the array is present in the cart
.subscribe(
items => {
console.log(items); // [{...},{...},{...},...]
}
);
提前致谢!
因为您同时拥有 items$
和 cart$
,您可能可以使用 combineLatest
或 zip
运算符,请执行以下操作:
import { of } from 'rxjs/observable/of';
import { zip } from 'rxjs/observable/zip';
import { combineLatest } from 'rxjs/observable/combineLatest';
// replace with your item service stream
const items$ = of([
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' }
]);
// replace with your cart stream
const cart$ = of([
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' }
]);
let result = [];
// use zip or combineLatest
combineLatest(items$, cart$)
.subscribe(([items, cartItem]) => {
result = items.map(item => ({
...item,
inCart: !!cartItem.find(x => x.id === item.id)
}));
// 1, 2, 3 incart = true, 4, 5 incart = false
console.log(result);
});