- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个名为 source1
和 source2
的 Observable Sequence。我想将 source2
与 source1
匹配,这样 source2
就不会与 source1
重叠:
// source1 = Rx.Observalble.range(...)
// source2 = Rx.Observable.range(...)
|.............| // `source1` range
|--------| // false: `source2` is overlapped
|--------| // false: `source2` is overlapped
|--------| // false: `source2` is overlapped
//|-------| // true: `source2` is not overlapped
// |--------| // true: `source2` is not overlapped
我的解决方案是使用 Rx.Observable#first
和 Rx.Observable#last
如下:
source1 = Rx.Observable.range(100, 50)
source2 = Rx.Observable.range(150, 10)
pred1 = source1.first().zip(source2.last(), (a, b) => a >= b)
pred2 = source1.last().zip(source2.first(), (a, b) => a <= b)
// Have to use #combineLatest to get it done, don't know why
// #zip doesnt work. Uncomment the line below to check
// pred1.zip(pred2, (a, b) => a || b).subscribe(x => console.log(x))
pred1.combineLatest(pred2, (a, b) => a || b).subscribe(x => console.log(x))
我期待看到使用其他运算符的解决方案,例如 #reduce
、#scan
、#flatMap
、# concatMap
或 #filter
。
原因是,上面的例子只是比较了两个范围。如果我有一个 array of range 需要检查它们是否相互重叠怎么办?考虑在这种情况下会有所帮助的 reducer
。
// `array_of_range` could be an array of observable sequences
let source = Rx.Observalbe.fromArray(array_of_range)
source.scan((prev, curr) => {
// Do magic here
}, false)
.subscribe(x => console.log(x)) //=> Check if any two ranges in the `source` are overlapped or not
并且如果范围重叠,如何将这些范围转换
为最佳的更小的新范围,以便它们不会相互重叠。我知道这不是微不足道的答案,所以任何建议都将不胜感激!
更新 01:感谢@joneshf,第一个问题可以解决如下:
Rx.Observable.merge(
Rx.Observable.range(0, 10),
Rx.Observable.range(11, 20),
Rx.Observable.range(21, 25)
)
.scan(({intersected, set}, n) => ({intersected: set.has(n), set: set.add(n)}),
{intersected: false, set: new Set()}
)
.pluck('intersected')
.reduce((prev, curr) => prev || curr)
.subscribe(x => x ? ‘There was an intersection’ : ‘No intersection’)
欢迎进一步讨论!
最佳答案
您可以按索引分组(使用 zip
)
zip(range(1, 10), range(5, 10), range(10, 10)).subscribe(z => {
console.log(z);
});
//=> [ 1 , 5 , 10 ]
//=> [ 2 , 6 , 11 ]
//=> [ 3 , 7 , 12 ]
//=> [ 4 , 8 , 13 ]
//=> [ 5 , 9 , 14 ]
//=> [ 6 , 10, 15 ]
//=> [ 7 , 11, 16 ]
//=> [ 8 , 12, 17 ]
//=> [ 9 , 13, 18 ]
//=> [ 10, 14, 19 ]
然后你可以重建每个范围当且仅当它的数字以前从未见过:
const solution$ =
zip(range(1, 10), range(5, 10), range(10, 10)).pipe(
reduce(([rg, st], ns) => {
ns.forEach((n, i) => {
if (!st.has(n)) {
rg[i] ??= [];
rg[i].push(n);
st.add(n);
}
});
return [rg, st];
}, [[], new Set])
);
solution$.subscribe(([rg]) => {
console.log('Optimal ranges:',
rg.map(r => `[${r[0]}-${r[r.length-1]}]`).join(', '));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.2.0/rxjs.umd.min.js" integrity="sha512-MlqMFvHwgWJ1vfts5fdC2WzxDaIXWfYuAd9Tb2lobtF61Gk+HIRDrbtxgasBSM9lZgOK9ilwK9LqFIYEV+k0IA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
const {zip, range} = rxjs;
const {reduce} = rxjs.operators;
</script>
关于javascript - 如何解决 RxJS 范围重叠问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33748596/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!