我有一个类似的javascript数组var test = [2,5,8,12,56];
,现在我想搜索最接近的下一个值9。所以在这种情况下输出是12(而不是8!)。
问问题
2265 次
5 回答
6
那么这里有一个简单的方法来做到这一点:
function getNextVal(arr, val) {
// omit the next line if the array is always sorted:
arr = arr.slice(0).sort(function(a,b){return a-b;});
for (var i=0; i < arr.length; i++)
if (arr[i] >= val)
return arr[i];
// return default value when val > all values in array
}
如果搜索值在数组中,您不会说要返回什么,所以我假设您想要返回它。如果通过“最接近的下一个值”表示它应该始终返回高于搜索值更改的下一个数字arr[i] >= val
以使用>
而不是>=
.
如果你有一个大数组,你可能想要某种二进制排序,而不是从头开始。
于 2012-08-11T12:13:33.087 回答
1
如果数组已排序,您可以尝试以下方法,您需要针对边界情况进行调整,这只是为了算法的想法......
NUM is input
TEST is your array
INDEX is index variable
For INDEX from 0 .. TEST.SIZE -1
IF NUM > TEXT[INDEX]
RETURN TEXT[INDEX]
于 2012-08-11T12:13:12.270 回答
1
下面给出了一个非常简单的代码。希望对你有帮助
var test = [2,5,8,12,56];
var key = 9;
var closestNext=1000;
for(var i=0;i<test.length;i++)
{
if(test[i] > key)
{
if(test[i]<closestNext)
{
closestNext = test[i];
}
}
}
alert(closestNext);
于 2012-08-11T12:19:03.817 回答
0
1 首先对数组进行排序,使用arr.sort();
,只需按升序 ( 3,6,4,7,1 --> 1,3,4,6,7
) 对值进行排序,然后迭代:
function getNext(inputVal,arr)
{
arr.sort();;
for (var i=0;i<arr.lenght;i++)
{
if (arr[i] >= inputVal)
{
return arr[i];
}
}
throw new Error('Out of range');
}
于 2012-08-11T12:26:26.200 回答
0
如果您知道数组总是会被排序,或者如果事先对数组进行排序是合理的(例如,当数组不经常更改但您需要大量检索时),您可以对已排序的数组使用二进制搜索大批。
如果在数组中找不到该值,则返回上限,该上限指示大于给定值的最小元素。这平均给出了 O(log n) 的复杂度,而简单的方法(循环整个数组)平均给出了 O(n) 的复杂度。
// Binary search
// Adapted from http://jsfromhell.com/array/search
function binarySearch(arr, val, insert) {
var high = arr.length, low = -1, mid;
while (high - low > 1) {
mid = (high + low) >> 1;
if (arr[mid] < val) low = mid;
else high = mid;
}
if (arr[high] == val || insert) {
return high;
} else {
return -1;
}
}
function getClosestNext(arr, val) {
// Get index
var i = binarySearch(arr, val, true);
// Check boundaries
return (i >= 0 && i < arr.length) ? arr[i] : null;
}
于 2012-08-11T13:13:37.080 回答