2

これはサンプルデータです:

100 items or less = $20
200 items or less = $15
500 items or less = $10

シナリオ例: ユーザー入力150アイテム -> 価格は15アイテムあたり$

そして、これは私がどこまで到達するかです: http://jsfiddle.net/ByPh5/

<script type="text/javascript">

$(function(){

var tier_prices = {
    '100':'20',
    '200':'15',
    '500':'10'
}

var user_input = $('#user_input').val();

var price_output = 0;                    
/*
   calculate
*/

    $('#price_output').text(price_output)


})​

</script>

<input type="text" id="user_input" value="150"/>
<p id="price_output"></p>​

どんな助けでも大歓迎です

4

6 に答える 6

4

(注: あいまいな点が残っているため、500 個以上のアイテムも 20 ドルかかると仮定します。)

そのデータ構造をいじる代わりに、もっと簡単なことをすることができます。最初にコード、次に説明 (コメントが不十分な場合)。

function determine_price ( qty ) {
    var prices = [
        20, //0 to 99
        20, //100 to 199
        15, //200 to 299
        15, //300 to 399
        15, //400 to 499
        10  //500+
    ];

    //divide by the common denominator
    //0-99 turn into 0,
    //100-199 turns into 1
    //200-299 turns into 2
    //and so on
    qty = Math.floor( qty / 100 );

    //check for 600+, which are the same as 500 (last array item)
    return prices[ qty ] || prices.pop();
}

100、200、500 には共通点があります。それらは 100 の倍数です。したがって、配列を取得し、各要素を 100 の範囲であるかのように扱います。最初の要素 (0) は 0 から 99 項目、2 番目の要素 ( 1) は 100 ~ 199 項目などです。次に、入力数量ごとに、その共通分母で割り、どの範囲に収まるかを調べ、その数量に対応する価格を取得します。

あいまいさの場合は、600 以上の要素 (最後の要素、要素 #6 は 500 ~ 599 の要素) で発生するものであり、単純に最後の範囲の価格を取得します。

ループは必要ありません。単純な計算だけです。

于 2012-07-31T18:47:52.703 に答える
3

まず、価格帯の最大数量を指定する代わりに、最小数量を指定します。そして、並べ替えられた配列として定義して、反復できるようにします。

var tier_prices = [
    { minQty: 0,   unitPrice: 20 },
    { minQty: 101, unitPrice: 15 },
    { minQty: 201, unitPrice: 10 }
];

次に、入力した数量よりも大きい最小数量になるまで、値をループします。

var qty = +$('#user_input').val();
var price;
for (var i = 0; i < tier_prices.length && qty >= tier_prices[i].minQty; i++) {
    price = tier_prices[i].unitPrice;
}
$('#price_output').text(price * qty);

http://jsfiddle.net/gilly3/ByPh5/3/

于 2012-07-31T18:09:13.053 に答える
2

オブジェクトは素晴らしいですが、値を順番に確認することが保証されていないため、少し面倒です。

http://jsfiddle.net/radu/6MNuG/

$(function() {
    var tier_prices = {
        '100': '20',
        '200': '15',
        '500': '10'
    };

    $('#user_input').change(function() {

        var num = parseInt($(this).val(), 10),
            price = 0,
            prevTier = 0,
            maxTier = 0;            

        for (var tier in tier_prices) {
            if (tier_prices.hasOwnProperty(tier) && num <= tier) {
                if (tier < prevTier || prevTier == 0) {
                    price = tier_prices[tier];
                    prevTier = tier;
                }
            }

            if (tier > maxTier) maxTier = tier;
        }

        if (num > maxTier) price = tier_prices[maxTier];

        $('#price_output').text(price * num);
    });
})​;​

多次元配列の例:http://jsfiddle.net/radu/6MNuG/

$(function() {
    var tier_prices = [
        [100, 20],
        [200, 15],
        [500, 10]
    ];

    $('#user_input').change(function() {
        var num = parseInt($(this).val(), 10),
            price = 0,
            n = tier_prices.length - 1;

        if (num > tier_prices[n][0]) {
            price = tier_prices[n][1];   
        } else {
            for (var i = 0; i <= n; i++) {                   
                if (num <= tier_prices[i][0]) {
                    price = tier_prices[i][1];
                    break;
                }
            }
        }

        $('#price_output').text(price * num);
    });
});​
于 2012-07-31T16:57:37.167 に答える
1

試す:

var tier_prices = {
    '100': '20',
    '200': '15',
    '500': '10'
}
var price_output = 0;
var multiplier = 1;
$('#user_input').change(function() {
    var user_input = parseInt($('#user_input').val(),10);
    for (tier in tier_prices) {
        if (user_input <= tier) {
            multiplier = tier_prices[tier];
            break;
        }
    }
    $('#price_output').text(user_input * multiplier);
});​

jsFiddle の例

アップデート

オブジェクトのアイデアはあまり一般的でも機能的でもないため、単純なスイッチ/ケースでオブジェクトを放棄する例を次に示します。500 を超える数量のケースを追加したことに注意してください。

$('#user_input').change(function() {
    var user_input = parseInt($('#user_input').val(), 10);
    switch (true) {
    case user_input >= 0 && user_input <= 100:
        $('#price_output').text(user_input * 20);
        break;
    case user_input > 100 && user_input <= 200:
        $('#price_output').text(user_input * 15);
        break;
    case user_input > 200 && user_input <= 500:
        $('#price_output').text(user_input * 10);
        break;
    case user_input > 500:
        $('#price_output').text(user_input * 5);
    }
});​

jsFiddle の例

于 2012-07-31T17:07:20.070 に答える