我如何重构多个if ... els以便提高效率?

时间:2019-08-01 13:57:18

标签: javascript function refactoring

我有一个应用程序,该应用程序根据cartTotal总额计算费用。 它将使用[MutationObserver][1]捕获总计的修改。 当总数发生变化时,应基于2个数组应用不同的费用:1个用于汇总步骤以及相应的费用。

我想提高效率,避免使用所有这些else if语句。在MutationObserver中观察到更改时,我应该使用被调用的函数吗?我可以有效地利用firstIndex吗?

var fees = ["10","20","30"];
var steps = ["99.90","1200.00","3600.00"];
var observer = new MutationObserver(function (mutations) {
var cartTotal = parseFloat($('.total').html())
//apply different fee based on cart total
if (cartTotal <= 0) {
  shippingFee = 0;
} else if (cartTotal > 0 && cartTotal <= steps[0]) {
  shippingFee = fees[0];
} else if (cartTotal > steps[0] && cartTotal <= steps[1]) {
  shippingFee = fees[1];
} else if (cartTotal > steps[1] && cartTotal <= steps[2]) {
  shippingFee = fees[2];
} else if (cartTotal > steps[2] && cartTotal <= steps[3]) {
  shippingFee = fees[3];
} else if (cartTotal > steps[3] && cartTotal <= steps[4]) {
  shippingFee = fees[4];
} else if (cartTotal > steps[4] && cartTotal <= steps[5]) {
  shippingFee = fees[5];
} else {
  shippingFee = fees[6];
}
shippingFee = parseFloat(shippingFee);

observer.observe(changetotal, {
  childList: true
  });
 });

2 个答案:

答案 0 :(得分:2)

您可以使用Array#findIndex和一个嵌套的三元数。

var index = steps.findIndex(v => v <= cartTotal),
    shippingFee = cartTotal <= 0
        ? 0
        : index === -1
            ? fees[6]
            : fees[index];

答案 1 :(得分:0)

注意某些条件是多余的-您的if-elseifs等效于:

final BiFunction<Integer, String, HashMap<Integer, String>>  newHashMap = 
(k, v) ->{
   HashMap<Integer, String> map = new HashMap<>(); 
   map.put(k, v);
   return map;
}

HashMap<Integer, String> indexToNameMap = names.stream()
            .filter(name -> name.equals("test"))
            .map(name -> newHashMap.apply(index.incrementAndGet(), name))
            .findFirst()
            .orElseGet(() -> newHashMap.apply(0,  "UN_AVAILABLE"))

您可以将其滚动成一个循环:

if (cartTotal <= 0) {
  shippingFee = 0;
} else if (cartTotal <= steps[0]) {
  shippingFee = fees[0];
} else if (cartTotal <= steps[1]) {
  shippingFee = fees[1];
} else if (cartTotal <= steps[2]) {
  shippingFee = fees[2];
} else if (cartTotal <= steps[3]) {
  shippingFee = fees[3];
} else if (cartTotal <= steps[4]) {
  shippingFee = fees[4];
} else if (cartTotal <= steps[5]) {
  shippingFee = fees[5];
} else {
  shippingFee = fees[6];
}

您甚至可以通过在if (cartTotal <= 0) { shippingFee = 0; } else if (cartTotal <= steps[5]) { for (var i = 0; i <= 5; i++) { if (cartTotal <= steps[i]) { shippingFee = fees[i]; break; } } } else { shippingFee = fees[6]; } steps的开头包含零来使其更短。

我还建议不要在for循环中对值fees进行硬编码,而应基于数组的大小。