Вы можете полностью заполнить массив sp, вы можете добавить прямой индекс в массив во время выполнения. После создания исходной структуры данных это будет быстро во время выполнения, но не очень эффективно для хранения. Я обычно не рекомендую это, но для построения массива:
var ranges = [
{min: 0, max: 400, value: 'dog'},
{min: 401, max: 1000, value: 'cat'},
{min: 1001, max: 1233, value: 'rat'}
];
var lookupArray = [];
for (var i = 0; i < ranges.length; i++) {
// make sure array is big enough
lookupArray.length = Math.max(lookupArray.length, ranges[i].max);
for (var j = ranges[i].min, j <= ranges[i].max; j++) {
lookupArray[j] = ranges[i].value;
}
}
// function to find the value for a given index
function findValue(index) {
return(lookupArray[index]);
}
Или, в более компактной структуре, вы можете использовать структуру данных и такую функцию:
var ranges = [
{min: 0, max: 400, value: 'dog'},
{min: 401, max: 1000, value: 'cat'},
{min: 1001, max: 1233, value: 'rat'}
];
function findValue(index) {
var range;
for (var i = 0; i < ranges.length; i++) {
range = ranges[i];
if (index >= range.min && index <= range.max) {
return(range.value);
}
}
}
alert(findValue(402)); // 'cat'
Вы также можете использовать прямой массив с неявными позициями в массиве (код и данные немного более компактны, но оба менее читабельны):
var ranges = [
0, 400, 'dog',
401, 1000, 'cat',
1001, 1233, 'rat'
];
function findValue(index) {
for (var i = 0; i < ranges.length; i+=3) {
if (index >= ranges[i] && index <= ranges[i+1]) {
return(ranges[i+2];
}
}
}