jQuery:如何计算所有匹配元素的最大属性值?

请考虑以下HTML:

...

您如何找到所有.a元素的最大x值?

假设所有x值都是正整数。

只需循环它们:

 var maximum = null; $('.a').each(function() { var value = parseFloat($(this).attr('x')); maximum = (value > maximum) ? value : maximum; }); 

我有另一个版本:

 var numbers = $(".a").map(function(){ return parseFloat(this.getAttribute('x')) || -Infinity; }).toArray(); $("#max").html(Math.max.apply(Math, numbers)); 

这使用map函数提取x-Attributes的值,将对象转换为数组并将数组元素作为函数参数提供给Math.max

Math.max技巧从http://ejohn.org/blog/fast-javascript-maxmin/中被盗

UPDATE

添加“|| -Infinity”以在没有属性时正确处理案例。 看@kubedan的小提琴

 var max = null; $('.a').each(function() { var x = +($(this).attr('x')); if (max === null || x > max) max = x; } alert(max === null ? "No matching elements found" : "The maximum is " + max); 

注意一元+运算符将属性转换为数字。 您可能希望添加一些错误检查以确保它实际上一个数字 – 并且该属性完全存在。 您可以将选择器更改为仅选择具有类和属性的元素: $('.a[x]')

 var max =0; $('.a').each(function(){ if(parseFloat($(this).attr('x'))>max) { max = parseFloat($(this).attr('x')) ; } }); alert(max); 

您也可以在jQuery中使用Array.sort,如此处所述,然后使用$(’。a:last’)来获取所选元素。

我正在做一些关于这个主题的测试,如果性能很重要,那么旧的但简单for金色将比jQuery.map()Math.apply()Array.sort()更好:

 var items = $(".a"); for (var i = 0; i < items.length; i++) { var val = items.eq(i).prop('x'); if (val > max) max = val; } 

以下是jsperf测试: http : //jsperf.com/max-value-by-data-attribute 。 没有什么是真正的激烈,但无论如何有趣。