Что эквивалентно .Max () в jquery - PullRequest
12 голосов
/ 05 сентября 2011

Мне было интересно, как мы можем написать оператор jquery, чтобы получить максимальное значение свойства совпадающих элементов.

в LINQ мы говорим что-то вроде этого:

var maxHeight = list.Max(a=> a.Height);

что такоелучший способ сделать это в JQuery?

в качестве примера, скажем, мы хотим выбрать максимальное числовое значение для всех: текстовых элементов внутри контейнера:

var allInputs = $("#container :text");
// how to get the max of parseInt(item.val())?

, конечно, иметь цикл над всеми элементами - это вариант, но ямне любопытно узнать, есть ли магия, связанная с jquery.

С уважением.

Ответы [ 4 ]

14 голосов
/ 05 сентября 2011

Одним из возможных решений является использование функции 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/

ОБНОВЛЕНИЕ:

В качестве альтернативы вы можете применить map следующим образом:

var values = $("input:text").map(function(index, el) { return parseInt($(el).val()); }).get();
9 голосов
/ 07 сентября 2011

Основываясь на всех разговорах здесь и моих поисках в сети, мы можем сказать, что (в настоящее время) не существует надежного встроенного способа 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/

0 голосов
/ 31 марта 2015

Я являюсь автором проекта с открытым исходным кодом http://www.jinqjs.com Используя jinqJs вы можете сделать следующее:

Вы можете получить максимум, сделав это:

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();  
0 голосов
/ 05 сентября 2011

Это может быть не прямое решение для этого с использованием массива:

<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>

Привет

...