Звучит так, будто вы хотите модифицированный бинарный поиск. Поскольку список находится в отсортированном порядке, бинарный поиск значительно улучшит производительность поиска по сравнению с линейным поиском, и если вы ничего не знаете о расстоянии между элементами в массиве, вы не сможете сделать намного лучше, чем бинарный поиск. Бинарный поиск нужно будет немного изменить, потому что вы ищете не равенство, а что-то такое же близкое, не переходя.
Вот фактический алгоритм, который продолжает делить данные поиска на 1/2 (идя с верхней половиной или нижней половиной каждый раз, основываясь на сравнении с тестовым значением), пока не будет получен только один элемент:
var testData = [0,1500,5000,9348,89234,109280,109281,109283,150000];
function findNearest(data, val) {
if (!data || !data.length) {
return(null);
}
var lowest = 0, mid;
var highest = data.length - 1;
while (true) {
if (lowest == highest) {
return(lowest);
}
mid = Math.ceil(((highest - lowest) / 2) + lowest);
if (data[mid] == val) {
return(mid);
}
else if (data[mid] < val) {
lowest = mid;
} else {
highest = Math.max(lowest, mid - 1);
}
}
}
А, рабочая тестовая программа: http://jsfiddle.net/jfriend00/rWk2X/
Примечание: этот код предполагает, что все значения в массиве расположены в отсортированном порядке, а массив не пустой.
Если вы дадите ему массив, у которого нет значений меньше целевого значения, он вернет 0, что может быть особым случаем, который вам нужно обработать, если только вы не уверены, что первое значение в массиве всегда меньше целевого значения (например, всегда ноль).
Если вы дадите ему массив, у которого нет значений, превышающих целевое значение, он вернет последнее значение в массиве (как и должно быть), и это не особый случай, а только требуемый ответ.