用rxjs通过阈值来压平数值序列
Flatten sequence of numeric values by threshold with rxjs
使用rxjs,我得到了一个可观察的浮点数序列。现在,我想过滤掉流中较小的变化,只在值比以前发出的值大一定量的情况下发出值。
换句话说:总是发射序列中的第一个值。然后,每个发射的(=未滤波的)值应至少比之前的发射的值大delta。任何与该条件不匹配的值都将被筛选。
我已经提出了一个解决方案,做我想做的如上所述:
var obs = Rx.Observable.create(function(observer) {
/* ... */
});
var last;
obs.map(function(value) {
if (last === undefined) {
last = value;
return value;
} else {
var threshold = 0.5,
delta = Math.abs(last - value);
if (delta > threshold) {
last = value;
return value;
}
else {
return undefined;
}
}
}).
filter(function(value) {
return value !== undefined;
});
我是rxjs和反应式编程的新手,我认为上面的解决方案过于复杂。更重要的是,它违反了反应式编程的原则,即不要在组合管道外保存状态。但我会这样做,因为我通过last
变量进行跟踪,并希望去掉它。
我如何解决这个问题并以被动的方式进行?
您可以使用scan
来管理您的状态:
var filtered = obs.scan({}, function (acc, value) {
if (acc.value !== undefined) {
var threshold = 0.5,
change = Math.abs(acc.value - value);
if (change < threshold) {
return { value: acc.value, isValid: false };
}
}
return { value: value, isValid: true };
})
.filter(function (acc) { return acc.isValid; })
.map(function (acc) { return acc.value; });
我知道这个问题已经得到了答案,但如果你发现自己经常这样做,你可以自己动手。只是吐口水,因为这是一个有趣的实用程序:
Observable.prototype.maxThreshold = function(threshold, selector) {
var last = null;
return this.filter(function(x) {
var n = selector ? selector(x) : x;
var delta = Math.abs(n - last);
if(last === null || delta > threshold) {
last = n;
return true;
}
return false;
});
});
可按如下方式使用:
streamOfNumbers.maxThreshold(0.5).
subscribe(function(x) {
console.log(x);
});
或
streamOfObjects.maxThreshold(0.5, function(x) { return x.value; }).
subscribe(function(x) {
console.log(x);
});
相关文章:
- Highchart多阈值颜色
- WebAudio API麦克风分贝阈值/选通(麦克风输入太敏感)
- Highcharts.js设置用于更改列颜色的阈值
- 更改默认阈值或使用锤子 2(使用 jQuery 插件)锁定轴
- querySelectorAll:查找子级,直到遇到某个阈值元素
- 链接D3.js力布局网络的阈值函数中的笔划宽度
- 聚合物动态创建的元素不工作(铁卷轴阈值)
- 用rxjs通过阈值来压平数值序列
- 使用 JavaScript 累积具有阈值的价格
- 如何在滚动阈值量后循环 100% 高度的页面和 URL
- D3.js 折线和面积图 - 想要添加一条由两点定义并表示阈值/最小值的额外线(以便于查看)
- 我可以根据图表中的给定阈值设置不同的填充颜色吗.js
- 继续拖动事件,而不拖动超过任意阈值的元素
- 使用定义的阈值限制服务器调用次数
- JQuery-测试窗口的大小已超过阈值
- 如何在超过某个宽度阈值时刷新页面
- D3:是否可以根据阈值绘制一条线并将其分配给两个轴
- 正/负数值与阈值的稳健比较
- 创建使用50作为负值阈值的0-50-100百分位区域折线图
- React.js显示导航的滚动阈值