2017-08-07 79 views
1

假设我在某个列表项中有一个值,其值在3-10之间。有没有一种内置的方法可以将值的范围与JavaScript中值的范围进行匹配?

然后我们假设我使用范围从5-15进行搜索。

由于搜索范围的下端(5)属于列表中的条目范围(3-10),因此它应该匹配。

要做到这一点,我必须检查搜索范围值是否落在入口的范围值之间,以及是否为副。

虽然我有一个工作函数,我想知道是否有一种常见的模式或内置的方式来做JavaScript的这种“范围矩阵”过滤。我甚至不知道这种事情是否有一些实际的术语。

预期的行为:https://repl.it/Jz6c/0

+1

可以发布输入和期望的输出? – Selvakumar

+2

不,没有AFAIK ... – Li357

+0

如何声明搜索范围?作为最小值和最大值,还是有效值列表?你只处理整数吗? –

回答

0

也许这是一个多堆栈溢出问题上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()有两个对象的参数,每个都有一个minmax财产。

此代码总共进行八次比较(四次调用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,我和其他一些人就此话题进行了辩论。 (我在那里是“Stratoscope”,但特别要查找“barrkel”约三分之一的注释,列出此问题真值表的一条评论。)

该讨论的上下文是两个约会是否有冲突。例如,下午1-2点和下午2-3点的约会将会产生冲突而不是冲突,即使第一次会在第二次开始的同时结束。如果您的重叠范围的定义是不同的,所以1-2和2-3将被视为重叠,你应该能够通过使用<=代替<做到这一点:

function rangesOverlap(one, two) { 
    return one.min <= two.max && two.min <= one.max; 
} 

但公平的警告,我有未测试此版本的代码。

请注意,这不是特定于JavaScript的任何东西。相同的问题和相同的解决方案将适用于几乎所有的编程语言。

相关问题