ピンチで書いた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 は、見つけた最大の quantityOnHand です (settings.limitedStockThreshold の最大数)。
ネストされた for ループが本当に好きではなく、数学とデフォルト値の処理が複雑すぎるように感じます。
また、クリーンアップに役立つ場合は、この関数全体がはるかに大きな jQuery オブジェクトにラップされます。