为了方便地说明这个例子,我有一个这样的间隔:
-6 -3 0 3 6
<-------o---------o---------o---------o--------o------->
danger| warning | | normal | good
我将其存储为一个对象,(-3 到 3 之间没有任何注意)
编辑:这是我得到的数据结构,无法进行任何更改。
{ name: 'good', value: 6 },
{ name: 'normal', value: 3 },
{ name: 'warning', value: -3 },
{ name: 'danger', value: -6 },
给定一个值 x
我想确定它的位置。所以如果:
-
x = 3 or 4
,它将返回normal
-
x = 6 or 100
,它将返回good
-
x = -1 or 1 or -2
,它将返回 ''(因为没有为这些间隔分配任何内容) - 对于负数也是如此
我在 js 中的实现是循环遍历每个对象,如果它是 >=
,它会覆盖。但我会再次为底片编写相同的代码,但使用 <=
,有没有人有更好的实现方式?
var x = 4;
var returnInterval = '';
for (var point in interval) {
if (x >= interval[point].value) {
returnInterval = interval[point].name;
}
}
return returnInterval;
最佳答案
考虑像这样定义您的范围:
[
{ name: 'good', range: [6, Infinity },
{ name: 'normal', range: [3, 6] },
{ name: 'warning', value: [-6, -3] },
{ name: 'danger', value: [-Infinity, -6] }
]
利用现有数据,您可以像这样构建这样一个范围:
var points = [
{ name: 'danger', value: -6 },
{ name: 'warning', value: -3 },
{ name: 'normal', value: 3 },
{ name: 'good', value: 6 }
];
// PRE CONDITION: elements are sorted by value (ascending)
var prev = -Infinity;
for (i = 0, j = 0; i <= points.length; ++i) {
var current = i == points.length ? Infinity : points[i].value;
if (prev >= 0 || current <= 0) {
points[j].range = [prev, current];
++j;
}
prev = current;
}
它基本上跳过具有负开始值和正结束值的段。
然后,您可以对每个区域进行简单的边界检查。
function name(value)
{
for (var i = 0; i != points.length; ++i) {
var range = points[i].range;
if (value >= range[0] && value <= range[1]) {
return points[i].name;
}
}
return '';
}
检查是 >=、>、< 还是 <= 的具体细节由您决定。
关于javascript - 给定一个存储为 [{name, value},...] 的区间,我如何找到 x 所在的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27895726/