2

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

4

5 回答 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 回答