Что эквивалентно .Max() в jquery
Мне было интересно, как мы можем написать инструкцию jquery для получения максимального значения свойства согласованных элементов.
в LINQ мы говорим примерно так:
var maxHeight = list.Max(a=> a.Height);
Каков наилучший способ сделать это в jquery?
в качестве примера предположим, что мы хотим выбрать максимальное числовое значение для всех: текстовые элементы внутри контейнера:
var allInputs = $("#container :text");
// how to get the max of parseInt(item.val())?
конечно, наличие цикла по всем элементам является опцией, но мне любопытно узнать, есть ли волшебство, связанное с jquery.
С уважением.
Ответы
Ответ 1
Основываясь на всем разговоре здесь и моем поиске в сети, мы можем сказать, что (в это время) нет надежного встроенного метода jquery для вычисления .max() и .min() свойства элементов, соответствующих селектор.
Из того, что предложил Игорь, я придумал следующие две функции jquery, которые вы можете добавить в свой проект, если вам нужно снова и снова использовать функции .max() и .min():
$.fn.max = function(selector) {
return Math.max.apply(null, this.map(function(index, el) { return selector.apply(el); }).get() );
}
$.fn.min = function(selector) {
return Math.min.apply(null, this.map(function(index, el) { return selector.apply(el); }).get() );
}
// Usage:
var maxWidth = $("a").max(function() {return $(this).width(); });
var minWidth = $("a").min(function() {return $(this).width(); });
Смотрите демо здесь: http://jsfiddle.net/NF7v7/3/
Ответ 2
Одним из возможных решений является использование функции map
, а затем Math.max
к результату:
var values = $.map($("input:text"), function(el, index) { return parseInt($(el).val()); });
var max = Math.max.apply(null, values);
Если это необходимо, оно может быть записано в одну строку.
скрипт: http://jsfiddle.net/WuVLr/1/
UPDATE:
В качестве альтернативы вы можете применить map
следующим образом:
var values = $("input:text").map(function(index, el) { return parseInt($(el).val()); }).get();
Ответ 3
Это может быть непрямое решение для этого с использованием массива:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var mySizes=new Array();
$("input[type=text]").each(
function( intIndex ){
mySizes[intIndex] = $(this).val().length;
});
var largest = mySizes.sort(function(a,b){return a - b}).slice(-1);
alert("The maximun length is: " + largest);
});
</script>
</head>
<body>
<input type="text" value="Test"id="1"/>
<input type="text" value="Goodbye"id="2"/>
<input type="text" value="Bye"id="3"/>
<input type="text" value="Hello"id="4"/>
<input type="text" value="Hello world!"id="5"/>
<input type="text" value="Hi"id="6"/>
</body>
</html>
Привет
Ответ 4
Я являюсь автором проекта с открытым исходным кодом http://www.jinqjs.com
Используя jinqJs, вы можете сделать следующее:
Вы можете получить max, выполнив следующее:
var result = jinqJs().from([2,5,4,6,7,8,3]).orderBy([{sort: 'desc'}]).top(1).select();
или мин, выполнив следующее:
var result = jinqJs().from([2,5,4,6,7,8,3]).orderBy([{sort: 'desc'}]).bottom(1).select();