2011-09-05 10 views
10

Me preguntaba cómo podemos escribir una declaración jquery para obtener el valor máximo de una propiedad de elementos coincidentes.¿Cuál es el equivalente de .Max() en jquery

en LINQ que decir algo como esto:

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

¿cuál es la mejor manera de hacer esto en jQuery?

como un ejemplo digamos que queremos seleccionar el valor numérico máximo de todos: los elementos de texto dentro de un contenedor:

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

por supuesto que tiene un bucle sobre todos los elementos es una opción, pero tengo curiosidad saber si hay una magia que hacer con jquery.

Atentamente.

Respuesta

8

Basado en toda la conversación aquí y mi búsqueda en la red podemos decir que (en este momento) no existe una forma robusta de jquery incorporada para calcular .max() y .min() de un propiedad de los elementos que coinciden con un selector.

De lo que sugiere Igor me ocurrió con las dos funciones de jQuery que puede agregar a su proyecto si es necesario utilizar .max (.min) y() funcionalidades y otra vez:

$.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(); }); 

Vea una demostración aquí: http://jsfiddle.net/NF7v7/3/

10

Una de las posibles soluciones es utilizar map función y luego Math.max al resultado:

var values = $.map($("input:text"), function(el, index) { return parseInt($(el).val()); }); 
var max = Math.max.apply(null, values); 

Si es necesario puede ser escrito en una sola línea.

violín: http://jsfiddle.net/WuVLr/1/

ACTUALIZACIÓN:

alternativa, se puede aplicar map de esta manera:

var values = $("input:text").map(function(index, el) { return parseInt($(el).val()); }).get(); 
+0

Por qué '$ .map()' 'y no .map()'? –

+0

Agregado a la respuesta, pero no es mucho más corto –

+0

Si estoy leyendo [los documentos] (http://api.jquery.com/jQuery.map/) correctamente, objetos tipo array (como '$ ('input : text ') ') tienen que convertirse en matrices reales antes de pasarse a' $ .map'. Por otro lado '.map() 'está específicamente diseñado para objetos jQuery. Esto implica que '.map()' es la mejor opción aquí ... –

0

Esto podría ser una solución no directa para que el uso de una matriz:

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

Saludos

0

yo soy el autor del proyecto de código abierto http://www.jinqjs.com Uso jinqJs que podría hacer lo siguiente:

usted podría conseguir el máximo al hacer esto:

var result = jinqJs().from([2,5,4,6,7,8,3]).orderBy([{sort: 'desc'}]).top(1).select(); 

o el min al hacer esto:

var result = jinqJs().from([2,5,4,6,7,8,3]).orderBy([{sort: 'desc'}]).bottom(1).select(); 
Cuestiones relacionadas