2012-07-13 34 views
0

我有以下代碼:的Javascript - 比較值到關聯數組索引

var license_price = 0; 
    var num_licenses = jQuery('#num_licenses').val(); 
    var lp = {}; 

       lp[1]=12.50; 
       lp[10]=15.50; 
       lp[50]=50.00; 

    for(var index in lp) {alert(index); 
     if (num_licenses >= index){ 
      license_price = parseFloat(lp[index]); 
     } 
    } 
    //alert(license_price); 
    jQuery('#total_price').val((num_licenses * license_price)); 

此代碼確定在NUM_LICENSES框中輸入的值,則通過陣列LP進入並分配基於所述值的價格每個鍵。所以,如果num_licenses = 8,價格應該是12.50每個,如果num_licess = 60,價格應該是$ 60。

它適用於除2-9之外的所有值。如果輸入2-9,則使用來自fp [10]的價格。但是,如果它是1,那麼我得到12.50。

照顧, 李

回答

1

當您遍歷對象的索引它們類型爲字符串。你的比較實際上是按字母順序排序而不是數字排序。解析其數值以使其工作。 (按字母順序出現 '2' 之後的所有值以 '1' 時,包括 '10',所以 '2'> '10' 等)

for(var index in lp) { 
    alert(index); 
    if(lp.hasOwnProperty(index)) { // prevent comparison when property inherited 
     if (num_licenses >= parseInt(index,10)){ 
      license_price = parseFloat(lp[index]); 
     } 
    } 
} 
+0

的>如果兩個字符串使用,但如果數值與字符串和數字使用運營商將按照字母順序進行比較。在這種情況下,你的兩個值都是字符串,所以解析一個就可以正常工作。如果你想稍後用數字方式使用'num_licenses',你也必須解析它。 – nbrooks 2012-07-13 04:09:04

0

在代碼LP是一個對象不是一個陣列,所以index是一個String類型的屬性名稱。

試圖改變你的代碼

var lp = [];

,則指數將是一個數字。

+0

...除了使用真實數組以外,所有未填充的索引都會留下空白。「lp是[,12.50 ,,, ... ,,, 15.50 ,,, ... ,,, 50.00]' – nbrooks 2012-07-13 03:45:16

+0

你不需要這樣寫。 'var lp = []; lp [1] = 12.50; lp [10] = 15.50; lp [50] = 50.00;'是好的 – Charlie 2012-07-13 03:48:26

+0

並不意味着作爲一個賦值 - 意味着這就是'即使你通過直接引用索引來初始化它,lp也是如此。剩下的空間是「未定義的」,但仍然存在 - 這看起來像是浪費內存。在任何情況下,這個陣列真的不是真的這個 – nbrooks 2012-07-13 03:52:32

1

問題是你正在比較一個字符串與一個整數。 val()函數的結果是一個字符串。因此,如果您的輸入爲'2','2'< = 10的結果爲false。您應該使用parseInt()函數將其首先轉換爲整數。

下面是它應該是什麼樣子:

var license_price = 0; 
var num_licenses = parseInt(jQuery('#num_licenses').val(),10); 
var lp = {}; 

      lp[1]=12.50; 
      lp[10]=15.50; 
      lp[50]=50.00; 

for(var index in lp) {alert(index); 
    if (num_licenses >= index){ 
     alert("Greater than " + index);//added this for debugging 
     license_price = parseFloat(lp[index]); 
    } 
} 
//alert(license_price); 
jQuery('#total_price').val((num_licenses * license_price)); 

注意,我添加了一個parseInt函數()調用的值。我還添加了一些警報呼叫,以便您可以看到發生了什麼。

這裏是一個片段的jsfiddle一個鏈接,這樣就可以對其進行測試:http://jsfiddle.net/CmbvW/8/

+0

的正確類型的結構?我不知道。它如何返回一個數字? – 2012-07-13 03:58:49

+0

我只是引用了文檔。我假設它試圖解析它並檢查結果是否爲'NaN'。 – nbrooks 2012-07-13 04:00:52

+0

實際上,'typeof'表示它的值是一個字符串,即使我輸入一個整數。也許在文本框中它總是返回字符串,但對於其他類型,它可能會返回數字。我得看看那個...... – nbrooks 2012-07-13 04:05:37