在javascript数组中搜索最近的下一个值

在javascript数组中搜索最近的下一个值,javascript,Javascript,我有一个javascript数组,比如var test=[2,5,8,12,56]现在我想搜索最接近的下一个值9。因此,在这种情况下,输出是12(而不是8!)。如果对数组进行排序,您可以尝试以下方法,您需要针对边界情况进行调整,这只是为了了解算法 NUM is input TEST is your array INDEX is index variable For INDEX from 0 .. TEST.SIZE -1 IF NUM > TEXT[INDEX]

我有一个javascript数组,比如
var test=[2,5,8,12,56]现在我想搜索最接近的下一个值9。因此,在这种情况下,输出是12(而不是8!)。

如果对数组进行排序,您可以尝试以下方法,您需要针对边界情况进行调整,这只是为了了解算法

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]

这里有一个简单的方法:

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
}
函数getNextVal(arr,val){ //如果数组始终排序,请忽略下一行: arr=arr.slice(0).sort(函数(a,b){返回a-b;}); 对于(变量i=0;i=val) 返回arr[i]; //当val>数组中的所有值时返回默认值 }
如果搜索值在数组中,您不会说要返回什么,所以我假设您想要返回它。如果“最近的下一个值”意味着它应该总是返回比搜索值高的下一个数字,请更改
arr[i]>=val
以使用
而不是
=


如果你有一个大数组,你可能需要某种二进制排序,而不是从头开始。希望这对你有帮助

   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);
​
var检验=[2,5,8,12,56];
var-key=9;
var closestNext=1000;
用于(变量i=0;i键)
{

如果(test[i]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');
}
函数getNext(inputVal,arr) { arr.sort();; 对于(变量i=0;i=inputVal) { 返回arr[i]; } } 抛出新错误(“超出范围”); }
如果您知道数组总是要排序,或者如果事先对数组进行排序是合理的(例如,当数组不经常更改但需要大量检索时),则可以对排序后的数组使用二进制搜索

如果在数组中找不到该值,则返回上界,该上界指示大于给定值的最小元素。这将平均给出O(logn)复杂度,而朴素方法(在整个数组上循环)平均给出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;
}
//二进制搜索
//改编自http://jsfromhell.com/array/search
函数二进制搜索(arr、val、insert){
var高=平均长度,低=-1,中;
而(高-低>1){
中=(高+低)>>1;
如果(arr[mid]=0&&i
如果搜索57,输出应该是什么?数组通常有多长?只有像上面这样的几个元素或几千个元素?如果数组总是排序的,只需对排序数组中的值进行二进制搜索,只需稍加修改,即当搜索间隔变为空时,应返回上限。这s给出O(logn)复杂度,而天真的方法给出O(n)复杂度。请注意,
sort
具有破坏性。@nnnnnnnnnn很自然。抱歉,我错过了它。@some-没关系,这些细节很容易错过:我必须编辑我的答案以包含排序回调函数(这样它实际上会按数字顺序排序,这是我一开始没有想到的)。是的..误读了他需要下一个到12的问题..注意
arr.sort()
将按字典顺序排序(例如,“2”之前的“12”)除非您提供回调以执行其他操作,并且您可能希望在排序之前制作数组的副本,而不是更改输入数组。