假设我在list items中的某个位置有一个值,该值的范围是3-10
。
然后假设我使用5-15
中的一个范围进行搜索。
由于搜索范围的低端(5
)落在列表中的条目(3-10
)的范围内,因此它应该匹配。
为此,我必须检查搜索中的任一范围值是否落在条目的范围值之间,反之亦然。
虽然我有一个用于此的工作函数,但我想知道在JavaScript中是否有通用模式或内置方法来执行这种“范围矩阵”过滤。我甚至不知道这类事情是否有一些实际的命名。
发布于 2017-08-07 14:37:04
也许这更像是一个Code Review问题,而不是一个堆栈溢出问题,但既然我们在这里...
基于your repl.it demo,您似乎在问是否有更简单的方法来编写此代码:
var matchesRange = function(min, max, value) {
return value >= min && value <= max;
};
var matchesRangeMatrix = function(searchRange, targetRange) {
return matchesRange(searchRange.min, searchRange.max, targetRange.min) ||
matchesRange(searchRange.min, searchRange.max, targetRange.max) ||
matchesRange(targetRange.min, targetRange.max, searchRange.min) ||
matchesRange(targetRange.min, targetRange.max, searchRange.max);
};
其中使用两个对象参数调用matchesRangeMatrix()
,每个对象参数都有一个min
和max
属性。
这段代码总共进行了八次比较(四次调用matchesRange
,每次两次比较)。
只需进行两次比较,就可以完成整个过程。让我们去掉matrix
命名法,因为这似乎使它听起来比实际情况更复杂。相反,如何使用名为rangesOverlap()
的函数
function rangesOverlap( one, two ) {
return one.min < two.max && two.min < one.max;
}
这就是你所需要的!尝试此updated version of your repl.it,并将结果与原始结果进行比较。
如果你想知道这么简单的东西是如何工作的,我邀请你阅读this Hacker News discussion,在那里我和其他一些人讨论了这个话题。(我是那里的“平流镜”,但特别要看看"barrkel“的评论,它列出了这个问题的真值表,大约占页面的三分之一。)
讨论的背景是两个任命是否冲突。例如,1-2 2pm和2-3 2pm的约会不会冲突,即使第一个约会在第二个约会开始的同时结束。如果您对重叠范围的定义不同,因此1-2和2-3将被视为重叠,则应该能够使用<=
而不是<
来执行此操作
function rangesOverlap( one, two ) {
return one.min <= two.max && two.min <= one.max;
}
但公平地说,我还没有测试过这个版本的代码。
请注意,这并不是JavaScript所特有的。同样的问题和解决方案几乎适用于任何编程语言。
https://stackoverflow.com/questions/45539539
复制相似问题