我想确定区域被赋予任意数字的位置。
zones = [0, 150, 300, 400, 600, 800]
function checkZone(mouseX) {
// if mouseX is 321, it should be index 2 of zones array
}
答案 0 :(得分:5)
您可以使用以下循环来执行此操作。为了测试目的,我已经包含了整个页面。
<html>
<body>
<script type="text/javascript">
var i; var y = 0; var val = 321; var zones = [0,150,300,400,600,800];
for (i = 0; i < zones.length; i++)
if (val >= zones[i])
y = i;
document.write("Value " + val + " is at position " + y);
</script>
</body>
</html>
使用各种测试数据:
Value -99 is at position 0
Value 0 is at position 0
Value 149 is at position 0
Value 150 is at position 1
Value 321 is at position 2
Value 521 is at position 3
Value 799 is at position 4
Value 800 is at position 5
Value 999 is at position 5
答案 1 :(得分:3)
如果你的数组很大,检查每个元素会很慢。在这种情况下,二进制搜索可能会很好。这是一些示例代码(未经测试,但我在晚上的这个时候可以做到深思熟虑):
function checkZone(mouseX) {
var low = 0, high = zones.length, i;
if (mouseX >= zones[high]) {
low = high
}
while (high - low > 1) {
i = low + Math.floor((high - low) / 2);
if (mouseX >= zones[i]) {
low = i;
} else {
high = i;
}
}
return zones[low];
}
注意:我尝试在15分钟左右发布此内容,但是我的答案得到了解答,我不得不重做其中的大部分内容。
答案 2 :(得分:0)
数字数组是按升序排序的吗?如果是,那么你有两个选择。如果数组的大小相对较小,只需循环遍历它,并找到适当的区域。否则实现二进制搜索(快得多)。
答案 3 :(得分:-1)
这应该更好更快:
console.clear();
var zones = [800, 400, 150, 0, 300, 600]; // unsorted array
zones.sort(); // sort for function comparison
console.log(zones);
function checkZone(mouseX) {
for( var i = (zones.length-1); mouseX < zones[i--];){ }
return ++i;
}
// perform 25 tests with random mouseX values 0-1000
for (var rnd=1,runs=25; runs-- && (rnd=Math.floor( Math.random()*1000 ))>=0; ){
console.log( (25-runs) + ". "
+ "mouseX:" + rnd + " , "
+ "index:" + checkZone(rnd) // checkZone(number) is all that's really needed
);
}
函数中的for循环将数组从最后一个数组值搜索到开头。一旦param不再小于数组值,循环退出并且函数返回该元素。我们必须在return变量中添加一个,因为当循环条件失败时,循环不会返回1。
如果您对console.log
感到不舒服,可以将其替换为document.write
或alert
。完成测试后,所需的只是排序数组,函数和函数调用。您可以废弃测试循环和所有随机数jibber-jabber。
示例输出:
[0, 150, 300, 400, 600, 800]
1. mouseX:458 , index:3
2. mouseX:17 , index:0
3. mouseX:377 , index:2
4. mouseX:253 , index:1
5. mouseX:446 , index:3
6. mouseX:764 , index:4
7. mouseX:619 , index:4
8. mouseX:653 , index:4
9. mouseX:337 , index:2
10. mouseX:396 , index:2
11. mouseX:107 , index:0
12. mouseX:820 , index:5
13. mouseX:850 , index:5
14. mouseX:117 , index:0
15. mouseX:659 , index:4
16. mouseX:393 , index:2
17. mouseX:906 , index:5
18. mouseX:128 , index:0
19. mouseX:435 , index:3
20. mouseX:712 , index:4
21. mouseX:841 , index:5
22. mouseX:259 , index:1
23. mouseX:447 , index:3
24. mouseX:809 , index:5
25. mouseX:892 , index:5