3 votes

Obtenir des valeurs en javascript où une plage est l'index d'un tableau

Je m'y prends probablement de la mauvaise façon, mais voici ce que j'aimerais faire en termes de pseudo-code :

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

alert(ranges[243]);

et comme par magie, le mot "chien" apparaît sur mon écran. Maintenant, je suis bien conscient que vous ne pouvez pas faire quelque chose d'aussi simple, mais je n'ai absolument aucune idée de la façon de faire quelque chose comme ça (sans faire une boucle dans un tableau, en effectuant un > et < sur une valeur, etc.)

Des idées ? :)

3voto

nnnnnn Points 70578

Vous pourriez remplir un simple tableau avec tous les doublons :

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"

Une option plus judicieuse serait d'utiliser une sorte de structure de données qui contienne réellement les valeurs basses et hautes de chaque plage :

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"

Vous pouvez aussi combiner les deux approches : passer la structure de données des plages avec les valeurs basses et hautes à une fonction qui utilise les informations pour remplir un autre tableau comme dans la première approche.

2voto

jfriend00 Points 152127

Vous pouvez remplir entièrement un tableau et vous pouvez créer un index direct dans le tableau au moment de l'exécution. Une fois que la structure de données originale est créée, cela sera rapide à l'exécution, mais pas très efficace en termes de stockage. En général, je ne recommande pas cette méthode, mais de construire le tableau :

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]);
}

Ou, dans une structure plus compacte, vous pouvez utiliser une structure de données et une fonction comme celle-ci :

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'

Vous pouvez également utiliser un tableau direct avec des positions implicites dans le tableau (le code et les données sont un peu plus compacts, mais les deux sont un peu moins lisibles) :

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];
        }
    }
}

2voto

awllower Points 253

Cette méthode est très simple et directe, mais elle suppose que vous ne voulez pas de "trous" dans vos gammes. Il n'y a pas de gestion des erreurs dans cet exemple, mais il suffit de passer les limites supérieures, les limites inférieures étant implicites.

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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X