我有一个应用程序,该应用程序根据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
});
});
答案 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
进行硬编码,而应基于数组的大小。