查找数组中的下一个最高数字 - jquery



>我有一个排序的数字数组 [2, 5, 12, 34, 56]和一个随机数"17"。我需要数组中下一个最高数字的索引。在这种情况下,我想接收"3",因为它是"34"的索引,这是我数组中下一个最高的数字。

有什么想法吗?

满足要求的函数可以像以下那样简单:

function getNextHighestIndex(arr, value) {
    var i = arr.length;
    while (arr[--i] > value);
    return ++i; 
}
getNextHighestIndex([2, 5, 12, 34, 56], 17);  // 3
getNextHighestIndex([2, 5, 12, 34, 56], 100); // 5
getNextHighestIndex([2, 5, 12, 34, 56], 0);   // 0

如果数组中没有高于提供的值的值,它将返回数组的长度。如果数组中的所有值都更高,它将返回 0。

按照 vzwick 的建议运行,您可以使用 underscore 的 filterindexOf 方法非常巧妙地做到这一点:

function getNextHighestIndex(arr, number) {
  return _.indexOf(arr, _.filter(arr, function(val) { 
    return val > number 
  })[0]);
}
getNextHighestIndex([2, 5, 12, 34, 56], 17);

或者香草JavaScript:

function getNextHighestIndex(arr, number) {
  for (var i = 0; i < arr.length; i ++) {
    if (arr[i] > number) {
      return i;
    }
  }
}
getNextHighestIndex([2, 5, 12, 34, 56], 17);

此代码将返回您要查找的索引,如果数组中没有更大的数字,则返回 -1。

function findNextHighest(array_input, compare_num){
    for (i=0;i<array_input.length;i++){
        if (array_input[i] > compare_num){
            return i;
        }
    }
    return -1; // Value returned if no highest number found in the array
}

请参阅:http://jsfiddle.net/w42wE/3/(单击运行)

var MyArray = [2, 5, 12, 34, 56]
var RandomNumber       = 17;
var MinGreaterThanPos;
for (var i =0; i < MyArray.length; i++) {
    if (MyArray[i] <= RandomNumber) 
        continue;
    if (typeof(MinGreaterThanPos) == 'undefined' || MyArray[i] < MinGreaterThanPos)
    { 
        MinGreaterThanPos = i;
    }
}
alert(MinGreaterThanPos);
for (var i=0; i<ary.length; i++;) {
  if (ary[i] > target) 
    return i;  
}
var myArray      = [2, 5, 12, 34, 56],
    randomNumber = 17;
var result = $(myArray)
    .map(function(i){ return (this > randomNumber) ? i : null })
    .get() // un-wraps the jQuery object to a proper Array
    .shift();

话虽如此,OP 可能希望将下划线.js作为一个更精简的选择 - 老实说,jQuery 对于这项任务来说有点矫枉过正。

如果你想要更复杂的东西,实现一个分而治之的搜索算法:

function find_next(list, query) {
    var pointer_upper = list.length - 1;
    var pointer_lower = 0;
    var pointer_tmp;
    while (pointer_upper - pointer_lower > 1) {
        pointer_tmp = Math.ceil((pointer_upper + pointer_lower)/2)
        if (list[pointer_tmp] <= query) {
            pointer_lower = pointer_tmp;
        } else {
            pointer_upper = pointer_tmp;
        }
    }
    return pointer_lower + 1;
}

find_next([2, 5, 12, 34, 56], 17); // returns 3

注意:此函数可能会返回小于query的结果(如果list中的所有元素都小于query) 。因此,也许您想在返回之前检查一下。

最新更新