gpt4 book ai didi

javascript - 为什么在订阅产生值后会调用 max 和 min ?

转载 作者:行者123 更新时间:2023-11-28 00:21:31 25 4
gpt4 key购买 nike

我有一个对象集合,在处理集合中的任何项目之前,我需要知道其数字范围。我想出了类似于下面的代码,它似乎给出了正确的答案:

var arr = Rx.Observable.fromArray([10,-10,4,-5,20,4,7]),
//In actual code this is an array of objects, so have a custom compare function
numberComparer = function(a,b) { return a-b; };

//In actual code this is prefixed by a filter and mapping operation
arr.flatMap(function(x) {
return Rx.Observable.zip(
arr.max(numberComparer),
arr.min(numberComparer),
function(max, min) {
return {
stats: {max: max, min: min},
item: x
};
}
);
})
.subscribe(function(item) {
DoStuffWithItem(item.item, item.stats);
});

但我对幕后发生的事情有点困惑。当第一个项目被生成到 subscribe 方法时,比较器函数给出了正确的答案,但随后它们在项目生成之间继续被调用。

这是一个JSBin showing what I mean 。我在这里做错了什么吗?有没有更好、更 Rx-y 的方法来做到这一点?我期望发生的是首先计算最大值和最小值,然后调用订阅函数,而不调用其他最大值或最小值。

编辑:看起来这种行为可能是它不断地与尚未输出的内容进行比较,这部分解释了我看到这种行为的原因。我只是不明白为什么要这样做(以及如何让它停止):)

最佳答案

你的第二个例子是在正确的轨道上。我建议使用 when() andthenDo 代替,它应该具有相同的行为,但你可以更清楚地传达你的想法意图,您不必担心同步。

    var minMax = Rx.Observable.when(
filteredArray.max().and(filteredArray.min())
.thenDo(function(x, y) {
return { max : x, min : y};
}));

minMax.flatMap(function() {
return filteredArray;
}, function(stats, x) {
return {stats : stats, value : x};
});

这是一个modifed version的例子。

由于这不是计算 minMax 的最有效方法,因为您要运行数组两次,因此您可以通过使用 reduce() 创建自己的 minMax 运算符来进一步优化。

Rx.Observable.prototype.minMax = function(comparer) {

var source = this,
c = comparer || function(x, y) {
return x - y;
};


return source.reduce(function(seed, x) {

if (c(x, seed.min) < 0) (seed.min = x);
if (c(x, seed.max) > 0) (seed.max = x);

return seed;

}, {min : Number.MAX_VALUE, max : Number.MIN_VALUE });

};

关于javascript - 为什么在订阅产生值后会调用 max 和 min ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29969625/

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