gpt4 book ai didi

javascript - RxJs:在不保持外部状态的情况下,通过 distinctUntilChanged() 过滤获取哪些对象键按顺序更改

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:39 25 4
gpt4 key购买 nike

orders$ 是如下所示的 RxJs 对象序列。我们使用 distinctUntilChanged() 监听更改,并根据更改的键采取不同的操作。我们能否在 tap() 内部知道哪个对象键实际发生了变化,而无需通过外部 previousItem 变量 ?

例子:

let orders$ = of([
{ main: 'pizza', drink: 'cola', id: 0},
{ main: 'pizza', drink: 'cola', id: 1},
...
{ main: 'pizza', drink: 'cola', id: 3332},
{ main: 'pizza', drink: 'fanta', id: 3333}, // <-- drink changes
]);

let previousItem = null;

orders$.pipe(
distinctUntilChanged((o0, o1) => o0.main === o1.main || o0.drink === o1.drink),
tap(item => {

/* Which value actually changed -'main' or 'drink' ?! */

if (previousItem && previousItem.main !== item.main) {
doSthForMainChanged();
}

doSthForDrinkChanged();
previousItem = item; // <-- ... so that not to tweak via external state

})).subscribe();

最佳答案

我建议用 scan 来完成:

source$.pipe(
scan((last: any, item: any) => {
let changes: any = {}
last.main !== item.main ? changes.main = true : false
last.drink !== item.drink ? changes.drink = true : false
return {item, changes}
}, {}),
tap(({item, changes}) => {
if (changes.main) {
doSthForMainChanged();
}
if (changes.drink) {
doSthForDrinkChanged();
}
})
)

如果需要,您还可以在末尾添加 distinctUntilChanged

关于javascript - RxJs:在不保持外部状态的情况下,通过 distinctUntilChanged() 过滤获取哪些对象键按顺序更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com