2011-09-14 89 views
0

我有這個代碼選擇所有與他們「record_」的文本字段。在jQuery輸入過濾名稱

$('input[name^="record_"]').map(function() { total += $(this).val() * 1; }); 

但其名稱爲「record_1,record_2和record_3」字段必須是* 8 *沒有1

我怎樣才能篩選搜索,這樣它僅發現3後有一個數字記錄? 我嘗試了一個IF函數,但是我做了上面的代碼意味着「record_15」將是* 8而不是* 1,因爲它應該是。 我知道這應該是簡單的,但我不能讓我的頭在附近。

+0

不回答你的問題,只是一個提示:您應該使用'每'而不是'map'。 'map'用於將jQuery對象轉換爲數組,而'each'則只是通過DOM元素並在其上運行提供的函數。 – Dennis

+0

歡呼的提示,生病嘗試,並在未來做到這一點 – SD1990

回答

2

這工作:

$('input[name^="record_"]').each(function() { 
    total += this.value * (parseInt(this.name.substr(7),10)<4 ? 8 : 1); 
}); 

DEMOhttp://jsfiddle.net/WKb7n/1/

它也避免了創建循環中不必要的變量或查找,這應該使之更有效率。

+0

(1)'每個'而不是'地圖'是更合適的; (2)'this.value'代替'$(this).val()'表現更好,更具可讀性; (3)將基數'10'傳入'parseInt'; (4)'this.name'而不是'$(this).attr('name')' - 與(2) –

+0

@Šime相同的原因:你說的沒錯。我會更新我的代碼,並且提高您的答案。 –

1

你可以這樣做:

$('input[name^="record_"]').map(function() { 
    var name = this.name; 
    var number = name.replace('record_', '') 
    if (number > 3){ 
     total += $(this).val() * 1; 
    }else{ 
     total += $(this).val() * 8; 
    } 
    console.log(number); 


}); 
1

試試這個:

$('input[name^="record_"]').each(function() { 
    var n = +this.name.split('_')[1]; 
    total += this.value * (n > 3 ? 1 : 8); 
}); 

現場演示:http://jsfiddle.net/QAMcA/1/

+0

只是好奇 - 爲什麼在'loop'函數內創建一個局部變量?只是爲了可讀性? (不是那不是一個完全正當的理由) –

+0

@Jens是的,爲了可讀性。通常情況下,我想在局部變量的末尾加上註釋來解釋這些值。另外請注意,局部變量超便宜,可以大量使用,使代碼更具可讀性。 –

+0

局部變量很便宜,但我仍然傾向於避免它們出現在循環和遞歸函數中,但這確實會使代碼變得不可讀,並且在很多情況下增益可以忽略不計。 –