我有一个排序的数字数组 [2, 5, 12, 34, 56] 和一个随机数“17”。我需要数组中下一个最高数字的索引。在这种情况下,我想收到“3”,因为它是“34”的索引,这是我数组中的下一个最高数字。
有任何想法吗?
我有一个排序的数字数组 [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 的建议运行,您可以使用下划线 filter
和indexOf
方法巧妙地做到这一点:
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
}
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 可能希望将underscore.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)
所以也许你想在返回之前检查一下。
见: 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;
}