【问题标题】:Check if value range is in array [closed]检查值范围是否在数组中[关闭]
【发布时间】:2014-03-28 00:24:20
【问题描述】:

什么:我有一个角度从 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 & input+range=75 所以如果数组中存在 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度)

【问题讨论】:

  • 那么这段代码就可以工作了,这就是你的意思吗?
  • 为什么不一开始就对数组进行排序呢?然后,您可以使用二进制搜索轻松检查。
  • @Andy - 它的功能并不完全,但很接近。我还没有解决翻车问题。如果有人有更好的方法,我很感兴趣。更好是指更快的执行。这对我来说似乎是一个臃肿的解决方案。
  • @AkshatSinghal 二进制搜索如何在执行时间方面增加?我没有想过要走那条路,因为直觉上它会更慢,但这可能是一个非常不正确的假设。
  • 对于折叠你只需要插入模运算(someangle+range)%360就是这样

标签: javascript jquery arrays search


【解决方案1】:

我发现了三个优化

首先:不要在循环中使用函数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++ ;){}

就像你删除了一个变量声明和一个比较操作。

【讨论】:

  • 喜欢第一个...第二个不行...我需要知道范围内的每个值。
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 2014-09-10
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多