2012-07-19 67 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]'属性,就像'