2012-07-05 29 views
16

Có một hàm hiện có nào tìm thấy phần tử mảng đầu tiên khớp với một số biến vị ngữ chung không?Cho một mảng và vị từ, tìm phần tử khớp đầu tiên

$.fn.findFirstMatching = function(predicate) { 
    var result; 
    $.each(this, function(index, value) { 
     if (predicate(index, value)) { 
      result = {index: index, value: value}; 
     } 
    }); 
    if (result) { 
     return result; 
    } 
}; 
+0

Tôi không tin như vậy, id gần nhất $ .grep khớp với tất cả đối với vị từ –

Trả lời

11

Nếu bạn sử dụng underscore.js, thì bạn có thể sử dụng phương thức find. Nó hoạt động ngay cả với các đối tượng jQuery lưu trữ bộ sưu tập các phần tử mà không có vấn đề gì.

_.find(array, function(value,index) { /* predicate */ }); 

Nhưng bên cạnh thư viện bổ sung (nhưng nhỏ) này bạn cần phải tự mình viết.

+0

Có vẻ tốt. Hóa ra chúng tôi đã sử dụng dấu gạch dưới, vì vậy nó thậm chí còn dễ dàng hơn. Đây là tài liệu cho bất kỳ ai quan tâm: http://underscorejs.org/#find – ripper234

+0

Cần lưu ý rằng đó là '(giá trị, chỉ mục)', trái ngược với lời gọi lại của 'jQuery.each' có' (chỉ mục, giá trị) '. – ripper234

-2

Use inArray method of jquery

Bạn có thể dễ dàng tìm ra chỉ mục của phần tử được tìm kiếm của bạn.

+1

Phương thức 'inArray' chỉ nhận một giá trị chứ không phải là một biến vị ngữ. – Guffa

16

Một giải pháp khác sẽ là:

$.grep(yourArray, function (value, index) { return value == 42 })[0] 

Lưu ý rằng thứ tự của các đối số nên value, index

Docs for jQuery.grep.

Tất nhiên, sử dụng _underscore là nhiều hơn nữa thanh lịch và hiệu quả (như $ .grep áp dụng biến vị ngữ trên tất cả các mục của mảng, nó không dừng sau trận đấu đầu tiên) , Nhưng dù sao :)

+0

@JLRishe, tài liệu jQuery nói rằng thứ tự phải là 'giá trị, chỉ mục'. – Apelsin

+0

@Apelsin Thật vậy, bạn nói đúng. Silly tôi, tôi phải có giả định '$ .grep' là phù hợp với' $ .each'. Hóa ra chúng thậm chí không nhất quán chút nào. – JLRishe

10

Tính đến ES2015, bạn có thể sử dụng Array.prototype.find

Một ví dụ của việc sử dụng nó trông như thế này:

// outputs the first odd number 
console.log([2,4,10,5,7,20].find(x => x%2)) 
+1

Tôi thích câu trả lời này là tốt nhất vì nó không yêu cầu bất kỳ thư viện hoặc khuôn khổ của bên thứ ba nào hoạt động. – northsideknight

1

Tuỳ chỉnh thực hiện có thể là thực sự khá ngắn và vẫn có thể đọc:

function findFirst(array, predicate) { 
    for (var i = 0; i < array.length; i++) if (predicate(array[i])) return array[i]; 
} 

Trả về mục đầu tiên khớp vị từ (hoặc không xác định) và sau đó dừng lặp lại - điều này có thể thuận tiện cho các mảng lớn hoặc nếu hàm vị ngữ phức tạp.

Các vấn đề liên quan