2011-09-05 35 views
10

Tôi đã tự hỏi làm thế nào chúng ta có thể viết một câu lệnh jquery để có được giá trị tối đa của một thuộc tính của các phần tử được so khớp.Tương đương với .Max() trong jquery

trong LINQ chúng ta nói một cái gì đó như thế này:

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

cách tốt nhất để làm điều này trong jquery là gì?

là một ví dụ giả sử chúng ta muốn chọn giá trị số tối đa của tất cả: yếu tố văn bản bên trong một container:

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

tất nhiên có một vòng khắp các yếu tố là một lựa chọn nhưng tôi tò mò muốn biết nếu có một phép thuật để làm với jquery.

Trân trọng.

Trả lời

8

Dựa trên tất cả cuộc hội thoại ở đây và tìm kiếm của tôi trên mạng chúng ta có thể nói rằng (tại thời điểm này) không có cách jquery tích hợp sẵn để tính .max() và .min() của thuộc tính của các phần tử khớp với bộ chọn.

Từ những gì Igor đề nghị tôi đã đưa ra hai hàm jquery sau đây mà bạn có thể thêm vào dự án của bạn nếu bạn cần phải sử dụng MAX() và .min() chức năng hơn và hơn:

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

Xem một bản demo ở đây: http://jsfiddle.net/NF7v7/3/

10

Một trong những giải pháp khả thi là sử dụng map chức năng và sau đó Math.max đến kết quả:

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

Nếu nó là cần thiết nó có thể được viết trong một dòng.

fiddle: http://jsfiddle.net/WuVLr/1/

UPDATE:

Hoặc bạn có thể áp dụng map theo cách này:

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

Tại sao '$ .map()' và không '.map() '? –

+0

Đã thêm vào câu trả lời, nhưng không ngắn hơn nhiều –

+0

Nếu tôi đọc chính xác [các tài liệu] (http://api.jquery.com/jQuery.map/), các đối tượng giống mảng (như '$ ('đầu vào) : text ') ') phải được chuyển đổi thành mảng thực tế trước khi được chuyển vào' $ .map'. Mặt khác '.map() 'đặc biệt dành cho các đối tượng jQuery. Điều này ngụ ý rằng '.map()' là sự lựa chọn tốt hơn ở đây ... –

0

Đây có thể là một giải pháp không trực tiếp cho rằng việc sử dụng một mảng:

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

Kính trọng

0

tôi là tác giả của dự án mã nguồn mở http://www.jinqjs.com Sử dụng jinqJs bạn có thể làm như sau:

bạn có thể nhận tối đa bằng cách làm này:

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

hoặc phút bằng cách làm này:

var result = jinqJs().from([2,5,4,6,7,8,3]).orderBy([{sort: 'desc'}]).bottom(1).select(); 
Các vấn đề liên quan