J'ai une fonction qui convertit deux valeurs en un pourcentage dans une plage, dans ce cas entre 15000 et 100000. Cela semble très maladroit. Existe-t-il un moyen plus simple d'exprimer cela qui soit facile / plus facile à comprendre?

price2percent = (sale) => {
    let price = sale.soldPrice / sale.livingArea;
    // Specifically these values
    price = price > 100000 ? 100000 : price;
    price = price < 15000 ? 15000 : price;

    return (price - 1500) / 85000;
} 
0
Himmators 20 nov. 2018 à 13:55

3 réponses

Meilleure réponse

Vous pouvez utiliser Math.min et Math.max pour contraindre les plages:

const adjustedPrice = Math.min(
  100000,                // can be no higher than 100000
  Math.max(price, 15000) // can be no lower than 15000
);
return (adjustedPrice - 1500) / 85000;

Une autre option est les conditions imbriquées, qui réduiront le nombre de réaffectations inutiles, bien que cela ne rende pas le code plus clair :

const adjustedPrice =
  price > 100000 ? 100000 :
    price < 15000 ? 15000 : price
2
CertainPerformance 20 nov. 2018 à 10:58

J'utilise habituellement cet utilitaire pour des choses comme ça:

const clamp = (value, min, max) => value > min? value < max? value: max: min;

price2percent = (sale) => {
    let price = clamp(sale.soldPrice / sale.livingArea, 15000, 100000);    
    return (price - 1500) / 85000;
}

Je trouve cela plus lisible que la construction Math.min(max, Math.max(min, value)).

Inconvénient, dans sa version actuelle, il ne fonctionne pas bien avec NaN.

1
Thomas 20 nov. 2018 à 20:05

Existe-t-il un moyen plus simple d'exprimer cela qui soit facile / plus facile à comprendre?

Facile à comprendre utiliserait la condition if / else:

price2percent = (sale) => {
  let price = sale.soldPrice / sale.livingArea;
  if(price > 100000) price = 100000
  else if(price < 15000) price = 15000
  return (price - 1500) / 85000;
} 

Qui peut être exprimé plus court comme suit: (la manière la plus difficile)

price2percent = (sale) => {
  let price = sale.soldPrice / sale.livingArea;
  price = price > 100000 ? 100000 : (price < 15000 ? 15000 : price)
  return (price - 1500) / 85000;
} 
0
Bhojendra Rauniyar 20 nov. 2018 à 12:52