2017-10-20 6 views
0

Hei, je travaille une application pour simuler les prix. J'ai un code comme celui-ci.javascript simplifié certaines fonctions avec presque le même code

function max110(x) { 
    if (x >= '1' && x <= '50') { 
     var sum = 120 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else if (x >= '51' && x <= '100') { 
     var sum = 115 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else if (x >= '101' && x <= '200') { 
     var sum = 110 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else { 
     hasil.value = 'error!'; 
    } 
} 

function max115(x) { 
    if (x >= '1' && x <= '50') { 
     var sum = 125 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else if (x >= '51' && x <= '100') { 
     var sum = 120 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else if (x >= '101' && x <= '200') { 
     var sum = 115 * x; 
     hasil.value = 'Rp.' + parseFloat(sum * 1000); 
    } else { 
     hasil.value = 'error!'; 
    } 
} 

Et j'ai encore des fonctions similaires à celles qui, presque le même code que je suis en train de faire simple, est-il possible de le faire en 1 seule fonction?

+0

est 'x' une chaîne ou un numéro? et si un nombre, est-ce un nombre entier? quelle est la fourchette attendue? –

+0

c'est une chaîne, devrais-je besoin de l'analyser en entier? –

+0

J'utiliserais toujours des nombres et il n'est pas clair pourquoi vous analyser un nombre.qu'est-ce que vous voulez en faire? –

Répondre

1

Essayez:

function maxval(x,maxval) { 
    if(x >= '1' && x <= '50'){ 
     var sum = (maxval+10)* x; 
     hasil.value = 'Rp.'+parseFloat(sum*1000); 
    } 
    else if (x >= '51' && x <= '100'){ 
     var sum = (maxval+5)* x; 
     hasil.value = 'Rp.'+parseFloat(sum*1000); 
    } 
    else if(x >= '101' && x <= '200'){ 
     var sum = (maxval)* x; 
     hasil.value = 'Rp.'+parseFloat(sum*1000); 
    } 
    else{ 
     hasil.value = 'error!'; 
    } 
    } 

Par la façon dont je supposais que par incréments de 5 maxval, Cant vous obtenez une meilleure solution sans obtenir plus de détails sur les fonctionnalités.

0

Ce serait ma mise en œuvre. Je ne suis pas d'accord avec la façon dont vous gérez vos entiers, mais c'est votre style de codage. Je passe dans un objet de choix qui a toutes les valeurs que je veux. Vous n'avez pas besoin de la logique, juste les valeurs. J'espère que personne ne se fâche que je monkeypatch String. Je suppose que votre variable x est une chaîne.

String.prototype.isBetween = function(lower, upper){ 
    int = parseInt(this) 
    return int >= parseInt(lower) && int <= parseInt(upper) 
} 

max110 = {0: 120, 1: 115, 2: 110} 
max115 = {0: 125, 1: 120, 2: 115} 
function max(x, values) { 
    let sum 
    hasil.value = '' 
    if (x.isBetween('1', '50')) { 
    sum = values['0'] * x 
    } else if (x.isBetween('51', '100')) { 
    sum = values['1'] * x 
    } else if (x.isBetween('101', '200')) { 
    sum = values['2'] * x 
    } else { 
    hasil.value = 'error' 
    } 
    hasil.value = hasil.value ? 'error' : 'Rp.'+parseFloat(sum*1000); 
} 
+0

Désolé je viens de commencer javascript depuis deux ou trois mois je ne comprends pas ce que c'est LOL :) –

+0

@naovalluthfi quelle partie? – Andrew

+0

C'est bien OOP? –

0
function max(x, extra) { 
    var sum_number = extra; 
    if(x >= '1' && x <= '50'){ 
    sum_number += 120; 
    } 
    else if (x >= '51' && x <= '100'){ 
    sum_number += 115; 
    } 
    else if(x >= '101' && x <= '200'){ 
    sum_number += 110; 
    } 

    if(x < 1 && x > 200){ 
    hasil.value = 'error!'; 
    } else { 
    hasil.value = 'Rp.'+parseFloat((sum_number) * x *1000); 
    } 
} 

paramètre extra peut être 0 ou 5 pour la fonction max110 ou max115

0

Fondamentalement, vous avez deux fonctions qui fonctionne de la même manière et retourne la même chose avec des valeurs différentes.

  • Les différentes valeurs yould être stockées dans un tableau et vous pouvez utiliser une seule fonction pour obtenir l'index, puis prendre la valeur nécessaire sur le tableau avec cet indice. Donc vous avez besoin d'une meilleure organisation des types de variables qui, si elles sont utilisées en nombre, doivent être des nombres et aussi des comparaisons, alors ce devrait être un nombre des deux côtés de la condition.

  • Utilisez un pure function, ce qui ne modifie pas un état de quelque chose qui n'est pas donné dans la fonction.

  • Utilisez un contrôle de la fonction des valeurs non désirées et la sortie précoce avec un premier contrôle à la frontière inférieure, dans votre cas, il est égal à zéro et au-dessous, le retour -1, parce que ce n'est pas un indice d'un tableau (et il est habituellement utilisé pour indiquer qu'aucun index n'est trouvé, comme avec Array#indexOf).

  • Ensuite, prenez la bordure supérieure pour une fin de fin de vérification précoce avec une valeur d'index, pas besoin de continuer structures else if.

  • À la fin de retour ainsi -1 pour l'index non trouvé.

Ensemble:

function getValue(x, maxArray) { 
 
    var index = getIndex(x); 
 
    if (index in maxArray) { 
 
     return 'Rp.' + maxArray[index] * x * 1000; 
 
    } 
 
    return 'error!'; 
 
} 
 

 
function getIndex(x) { 
 
    if (!x || x < 0) { 
 
     return -1; 
 
    } 
 
    if (x <= 50) { 
 
     return 0; 
 
    } 
 
    if (x <= 100) { 
 
     return 1; 
 
    } 
 
    if (x <= 200) { 
 
     return 2; 
 
    } 
 
    return -1; 
 
} 
 

 
var max110 = [120, 115, 110], 
 
    max115 = [125, 120, 115]; 
 

 
console.log(getValue(-1, max110)); 
 
console.log(getValue(10, max110)); 
 
console.log(getValue(10, max115));

+0

Je pense que je comprends comment cela fonctionne, mais je ne comprends pas pourquoi -1? –

+0

c'est juste une définition, parce que cette valeur n'est pas un index d'un tableau. vous pouvez jeter un coup d'oeil ici: ['Array # indexOf'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) –

+0

oh je sais que je sais désolé , Je viens de réaliser que quand je le relis –