是否有一种内置方法可以将值范围与JavaScript中的值范围进行匹配?

时间:2017-08-07 04:41:05

标签: javascript

我们说我在列表项中的某个位置有一个值,其值是File file = new File(Environment.getExternalStorageDirectory(), "Folder_name"); if (!file.exists()) { file.mkdirs(); }的范围。

然后让我说我使用来自3-10的范围进行搜索。

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

为此,我必须检查搜索中的任一范围值是否落在条目的范围值之间,反之亦然。

虽然我有一个工作功能,但我想知道是否有一种通用模式或内置方式来做这种"范围矩阵"在JavaScript中过滤。我甚至都不知道这种事情是否有一些实际的命名法。

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

1 个答案:

答案 0 :(得分:0)

或许这更像是Code Review问题,而不是Stack Overflow问题,但是因为我们在这里......

基于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我和其他一些人就这个话题进行辩论的地方。 (我&#39; m&#34; Stratoscope&#34;在那边,但特别是在&#34; barrkel&#34;在页面下方约三分之一的位置查找此问题的真值表。)

讨论的背景是两项任命是否发生冲突。例如,即使第一个会议在第二个会议开始的同一时间结束,但是从晚上1-2点和2-3点的约会将冲突。如果您对重叠范围的定义不同,那么1-2和2-3将被视为重叠,您应该可以使用<=代替<来执行此操作:

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

但是公平警告,我还没有测试过这个版本的代码。

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