naoval luthfi
naoval luthfi

Reputation: 771

Simplified javascript some function with almost the same code

Hei, I'm working an app to simulate prices. I have a code like this.

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

And I still have some functions similar to that, it almost the same code I'm trying to make it simple, is it possible to make it in 1 function only?

Upvotes: 0

Views: 63

Answers (4)

Nina Scholz
Nina Scholz

Reputation: 386883

Basically, you have two function which works the same way and returns the same with different values.

  • The different values yould be stored in an array and you could use a single function for getting the index and then take the needed value out of the array with that index.

  • So you need a better organisation of types of the variables, which if uses as number, it should be number and also for comparison, then it should be a number on both sides of the condition.

  • Use a pure function, which does not alter a state of something, which is not given into the function.

  • Use a check in the function for unwanted values and exit early with a first check at the lower border, in your case, it is zero and below, return -1, because that is not an index of an array (and it is usually used to denote, that no index is found, like with Array#indexOf).

  • Then take the upper border for a check end exit early with a index value, no need for continuing else if structures.

  • At the end return as well -1 for not found index.

Together:

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

Upvotes: 0

Stanley Cheung
Stanley Cheung

Reputation: 958

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

parameter extra can be 0 or 5 for function max110 or max115

Upvotes: 0

Andrew
Andrew

Reputation: 7555

This would be my implementation. I don't agree with how you're handling your integers, but it's your coding style. I pass in an object of choice that has all of the values that I want. You don't need the logic, just the values. I hope nobody gets mad that I monkeypatch String. I'm assuming that your variable x is a string.

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

Upvotes: 0

Blesson Christy
Blesson Christy

Reputation: 390

Try:

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

By the way i assumed that maxval increments by 5, Cant get you a better solution without getting more details about functionality.

Upvotes: 1

Related Questions