用于检查两个数字之间的逻辑

时间:2010-09-23 05:16:18

标签: javascript

我想确定区域被赋予任意数字的位置。

zones = [0, 150, 300, 400, 600, 800]

function checkZone(mouseX) {
    // if mouseX is 321, it should be index 2 of zones array
}

4 个答案:

答案 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.writealert。完成测试后,所需的只是排序数组,函数和函数调用。您可以废弃测试循环和所有随机数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