我有一些我在紧要关头写的 JavaScript,但我认为它可以被比我聪明的人大大优化。这段代码在相对较小的对象上运行,但它运行了相当多的次数,所以它值得做对:
/**
* Determine the maximum quantity we can show (ever) for these size/color combos
*
* @return int=settings.limitedStockThreshold
*/
function getMaxDefaultQuantity() {
var max_default_quantity = 1;
if (inventory && inventory.sizes) {
sizecolor_combo_loop:
for (var key in inventory.sizes) {
if (inventory.sizes[key].combos) {
for (var key2 in inventory.sizes[key].combos) {
var sizecolor_combo = inventory.sizes[key].combos[key2];
if (isBackorderable(sizecolor_combo)) {
//if even one is backorderable, we can break out
max_default_quantity = settings.limitedStockThreshold;
break sizecolor_combo_loop;
} else {
//not backorderable, get largest quantity (sizecolor_combo or max_default_quantity)
var qoh = parseInt(sizecolor_combo.quantityOnHand || 1);
if (qoh > max_default_quantity) {
max_default_quantity = qoh;
};
};
};
};
};
};
return Math.min(max_default_quantity, settings.limitedStockThreshold);
};
首先,库存是通过 JSON 返回的对象。它有一个属性inventory.sizes,其中包含产品的所有可用尺寸。每个尺码都有一个属性inventory.sizes.combos,它映射到一个尺码的所有可用颜色。每个组合还有一个属性quantityOnHand,它告诉特定组合可用的数量。(返回的JSON结构不能修改)
代码所做的是遍历每个尺寸,然后是每个尺寸的组合。然后它检查尺寸-颜色组合是否可延期交货(通过另一种方法)。如果任何组合可延期交货,我们可以停止,因为默认数量已在别处定义。如果组合不可延期交货,则 max_default_quantity 是我们找到的最大数量(最大为 settings.limitedStockThreshold)。
我真的不喜欢嵌套的 for 循环,而且我对数学和默认值的处理感觉过于复杂。
此外,如果这有助于清理它,那么整个函数将被包装在一个更大的 jQuery 对象中。