-1
votes

Comment mapper un numéro dans certaines gammes

J'ai une gamme de valeurs comme, par exemple, [0, 100] = [Minvalue, maxvalue] et le nombre de bandes, par exemple bands_number = 5 . Donc, je peux obtenir ces bandes: xxx

puis je souhaite associer une valeur d'échelle à chaque plage: xxx p> Cette valeur est calculée de cette manière: (i + 1) / bands_number i est l'index d'une boucle hypothétique.

alors je avoir une entrée n dont la valeur est dans la plage [Minvalue, maxvalue] = [0, 100] .

Ce que je veux est le Valeur d'échelle liée à ce numéro. Ainsi, par exemple, si: xxx

Comment puis-je créer une fonction comme ça? J'imagine une fonction comme celle-là: xxx

toutes les valeurs Voici des exemples, je veux que tout fonctionne avec toutes les autres valeurs.

Je ne fais pas Savoir comment faire à cela. J'ai besoin d'aide ...


4 commentaires

Le premier ensemble contient 21 articles tandis que les autres ont 19, est-ce normal?


@ Kévinbibollet premier défini contient 21, seconde dans les derniers ensembles contient 20, pas 19.


@ Kévinbibollet vous, ce n'est pas un problème si les ensembles ne contiennent pas le même nombre d'éléments


Cela ne pose pas de problème que les ensembles ne contiennent pas le même nombre d'éléments, mais vous devez alors indiquer comment vous souhaitez distribuer la plage. Dans votre exemple, vous décidez que l'élément supplémentaire appartient au premier ensemble. Est-ce toujours le cas? Et s'il y a 2 ou plusieurs éléments supplémentaires?


3 Réponses :


1
votes

Vous pouvez utiliser une fonction native array.map code> pour mapper chaque valeur.

quelque chose comme ceci: p>

p>

const vals = [
  [0, 20],
  [21, 40],
  [41, 60],
  [61, 80],
  [81, 100],
];

const BANDS_NUMBER = 5;

const result = vals.map((range, index) => (index + 1) / BANDS_NUMBER);

console.log(result);


0 commentaires

2
votes

Vous pouvez prendre une formule qui prend la plage et la fente et renvoie une valeur normalisée.

en raison de la plage, qui est un peu trop long (la dernière valeur est incluse dans l'intervalle), vous avez besoin d'un Vérifiez la dernière valeur et évitez de recevoir la valeur suivante, en dehors de l'intervalle recherché. P>

p>

function normalize(min, max, bands, n) {
    return n === max
        ? 1
        : Math.floor(1 + ((n - min) / (max - min)) * bands) / bands;
}

// 0.2 0.2 0.4 0.4 0.8 1 1
console.log(...[0, 10, 20, 35, 68, 99, 100].map(normalize.bind(null, 0, 100, 5)));


1 commentaires

Merci mais ce que je veux, c'est un peu différent. Je préfère que votre fonction est devenue la fonction normalisant (Minvalue, maxvalue, bandsnumber, n) {...}



1
votes

Nina Scholz's Réponse est faux. Sa fonction normale renvoie 0.4 code> au lieu de 0.2 code> pour la valeur 20 code>:

p>

const index = (min, max, bands, n) =>
    Math.floor(bands * (n - min) / (max - min + 1));

const value = (min, max, bands, n) =>
    (index(min, max, bands, n) + 1) / bands;

const result = n => value(0, 100, 5, n);

console.log(result(0),  result(20));  // 0.2 0.2
console.log(result(21), result(40));  // 0.4 0.4
console.log(result(41), result(60));  // 0.6 0.6
console.log(result(61), result(80));  // 0.8 0.8
console.log(result(81), result(100)); // 1 1


0 commentaires