什么:我有一个数组,其角度从0到360,输入预定义范围,定期更新输入范围从0到360.我想检查输入是否在数组的预定义范围。
示例
array:
array[0]=100, array[1]=40, array[2]=320, array[3]=60, etc....
我需要做的是查看输入是否允许说
input:
input=50;
在数组
中任何值的范围内range:
range=25;
我需要做什么代码: 较低的范围=输入范围&上限=输入+范围 如果数组中存在较低范围和较高范围之间的值,则输出数组编号。
完成示例: input-range = 25&输入+范围= 75 所以,如果一个介于25和25之间的值75存在于数组
中 array[1]=40 & array[3]=60
在此范围内。
输出数组键:
output[0]=1, output[1]=3
方法 创建一个新的嵌套数组,其中添加了范围并从每个数组组件中的值中减去。然后是一个for循环来检查输入是否在任何值范围内。
示例解决方案:
var nodeArray=new Array();
for(var i = 0; i<array.length;i++){
nodeArray[i].push(array[i]-range);
nodeArray[i].push(array[i]+range);
}
then the function to check:
for(var j=0;i<array.length;i++){
if ((input>nodeArray[j][0])&&(input<nodeArray[j][1])){
alert("within range");
}
}
问题我需要一个快速执行的解决方案,因为执行时间对我来说非常重要,我很好奇是否有人对如何解决这个问题有了很多改进。
注意:我还没有解决折叠问题(350度+ 20度= 10度)
答案 0 :(得分:3)
我找到了三个优化
首先:不要在循环中使用函数length
,因为每次调用该函数。声明一个新变量并将数组长度保存在其中:
for(var j=0, arrayLength = array.length; j < arrayLength ;j++){}
第二:如果您只需要知道某个值是否在该范围内,请在您的要求break
中使用if
退出'for'循环:
if ((input>nodeArray[j][0])&&(input<nodeArray[j][1])){
alert("within range");
break;
}
第三:您可以更改编写for循环的方式。
for(var i = -array.length; i++ ;){}
就像你删除一个变量声明和一个比较操作一样。