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

时间:2012-08-11 12:04:08

标签: javascript

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

5 个答案:

答案 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);
​

see the working one here

答案 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;
}