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 。 没有什么是真正的激烈,但无论如何有趣。