2012-07-19 69 views
1

如何在不使用.each()並僅使用JQuery選擇器的情況下編寫這兩者?jquery匹配查詢的長度

var xxxx = 0; 
$('.clonedInput').each(function(index) { 
    if($(this).children().filter(':checked').length == 2) 
    xxxx++; 
}); 


var num_normal_foods = 0; 
$('[id^="amount_"]').each(function(index) { 
    if($(this).val() == '30.00') 
    num_normal_foods++; 
}); 
+2

那麼使用'.each()'有什麼不好?不管你如何編寫這段代碼,你都會在某個地方執行一個隱式循環。 – Blazemonger 2012-07-19 13:27:11

+1

張貼HTML也是,plz。 – F0G 2012-07-19 13:31:54

回答

3

讓我們這個一步一步一次。

您開始使用:

var xxxx = 0; 
$('.clonedInput').each(function(index) { 
    if($(this).children().filter(':checked').length == 2) 
    xxxx++; 
}); 

對我來說這看起來像你只是想filter.clonedInput元素的集合,並找出有多少匹配濾波器:

var xxxx; 
function hasTwoCheckedChildren(i) { 
    return $(this).children(':checked').length == 2; 
} 
xxxx = $('.clonedInput').filter(hasTwoCheckedChildren).length; 

由其次:

var num_normal_foods = 0; 
$('[id^="amount_"]').each(function(index) { 
    if($(this).val() == '30.00') 
    num_normal_foods++; 
}); 

再次,這看起來像一個過濾器環功能對我說:

var num_normal_foods; 
function valueIsThirty(i) { 
    return +$(this).val() === 30; 
} 
num_normal_foods = $('[id^="amount_"]').filter(valueIsThirty).length; 

最後,重要的是,該代碼做你想讓它做什麼。如果你用.each編寫的代碼做了你想要的代碼,那麼就沒有必要改變它。無論如何,幕後花絮filter使用each

+0

我會使用'+ $(this)。val()=== 30'爲最後一個 – Alnitak 2012-07-19 13:41:29

+0

@Alnitak,也可以工作,但'val()'返回一個字符串,我們真的只關心它是否等於'30'。我想,如果你想確定像'0x1E'這樣的東西被正確計數爲'30',那麼你的方法就會更有彈性。 – zzzzBov 2012-07-19 13:44:57

+1

其實我更關心'30.00',根據OP的當前代碼。 – Alnitak 2012-07-19 14:03:20

3

jQuery的選擇有。長度屬性:

var len = $('.clonedInput :checked').length; 
var len2 = $('[id^="amount_"][value="30.00"]').length; 

第一查詢將返回所有任何.clonedInput類的檢查孩子的,然後計算它們。

第二個查詢查找以amount_開頭且值爲「30.00」的所有ID。 (屬性查詢可串連那樣[] [])

編輯:滿足@Blazemonger

得到的任何類型的元件(值適用於一些)的值,使用:

var len2 = $('[id^="amount_"]').filter(function() { 
    return $(this).val() == "30.00"; 
}).length; 

雙擊編輯,因爲我很沒用

var len = $('.clonedInput').filter(function(){ 
    return $(this).children(':checked').length == 2; 
}).length; 
+0

「value」屬性不一定與'.val()'相同。 – Blazemonger 2012-07-19 13:30:47

+0

@Blazemonger你是什麼意思 – bugwheels94 2012-07-19 13:33:48

+0

這兩個選擇器都是錯的。第一個是因爲原始函數正在過濾'.clonedInput'元素,它具有***正好2 ***檢查的孩子,而不是簡單*任何*檢查的後代。第二個是錯誤的,因爲'.val()'不一定會得到'[value]'屬性,就像'