Получение в значениях JavaScript, где диапазон является индексом в массиве - PullRequest
3 голосов
/ 28 сентября 2011

Я, вероятно, поступаю об этом совершенно неправильно, но в псевдокоде я бы хотел сделать следующее:

ranges = new Array([0 - 400] = 'dog',
               [401 - 1000] = 'cat',
               [1001 - 1233] = 'rat');

alert(ranges[243]);

и волшебным образом вытащить «собаку» на моем экране. Теперь я хорошо знаю, что вы не можете сделать что-то такое простое, но я абсолютно не знаю, как сделать что-то подобное (без циклического перебора массива, выполнения> и <значения и т. Д.) </p>

Есть идеи? :)

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Ну, вы можете заполнить простой массив всеми дубликатами:

var i,
    ranges = [];

for (i = 0; i <= 400; i++) ranges[i] = "dog";
for (i = 401; i <= 1000; i++) ranges[i] = "cat";
for (i = 1001; i <= 1233; i++) ranges[i] = "rat";

alert(ranges[243]); // "dog"

Более разумным вариантом может быть использование некоторой структуры данных, которая фактически содержит низкие и высокие значения каждого диапазона:

var ranges = [
  { "low" : 0, "high" : 400, "animal" : "dog" },
  { "low" : 401, "high" : 1000, "animal" : "cat" },
  { "low" : 1001, "high" : 1233, "animal" : "rat" }
];

function getAnimal(index) {
   for (var i=0; i < ranges.length; i++)
      if (ranges[i].low <= index && ranges[i].high >= index)
         return ranges[i].animal;

   return "Out of range"; // or could leave it to return undefined
}

alert(getAnimal(243)); // "dog"
alert(getAnimal(100000)); // "Out of range"

Или вы можете объединить два подхода: передать структуру данных диапазонов с низкими и высокими значениями функции, которая использует информацию для заполнения другого массива согласно первому подходу.

2 голосов
/ 28 сентября 2011

Это очень просто и понятно - хотя предполагается, что вам не нужны «дыры» в ваших диапазонах.В этом примере нет обработки ошибок, но по сути вам нужно просто передать верхние границы, нижние границы неявные.

function test() {
    var array = MakeRangeArray([500,1000,2000], ['dog', 'cat', 'rat']);

    alert (array[243]);
    alert (array[500]);
    alert (array[501]);
}

function MakeRangeArray(upperBounds, values) {
   var rangeArray = new Array(upperBounds[upperBounds.length-1]);

   var idx = 0;
   for (var i=0; i < rangeArray.length; i++) {
      if (i > upperBounds[idx]) {
        idx++;
      }
      rangeArray[i] = values[idx];
   }
   return rangeArray;
}
2 голосов
/ 28 сентября 2011

Вы можете полностью заполнить массив 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];
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...