我有一个类似var test = [2,5,8,12,56];
的javascript数组,现在我想搜索最接近的下一个值9.因此在这种情况下输出为12(而不是8!)。
答案 0 :(得分: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
}
如果搜索值在数组中,您不会说要返回什么,所以我假设您要返回它。如果通过&#34;最接近的下一个值&#34;您的意思是它应始终返回下一个更高的数字而不是搜索值更改arr[i] >= val
以使用>
而不是>=
。
如果您有一个大型数组,您可能需要某种二进制排序,而不是从头开始。
答案 1 :(得分: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]
答案 2 :(得分: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);
答案 3 :(得分: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');
}
答案 4 :(得分: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;
}