2012-07-05 25 views
16

Czy istnieje istniejąca funkcja, która znajduje pierwszy element tablicy pasujący do jakiegoś ogólnego predykatu?Biorąc pod uwagę tablicę i predykat, znajdź pierwszy pasujący element.

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

Nie wierzę tak, najbliższy id $ .grep, który pasuje do wszystkich przeciwko predykatowi –

Odpowiedz

11

Jeśli używasz underscore.js, następnie można użyć find metody. Działa nawet z obiektami jQuery przechowującymi kolekcję elementów bez problemów.

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

Ale oprócz tej dodatkowej (ale małej) biblioteki musisz napisać ją samodzielnie.

+0

Wygląda dobrze. Okazuje się, że używamy już podkreślenia, więc jest jeszcze łatwiej. Oto dokument dla każdego, kto jest zainteresowany: http://underscorejs.org/#find – ripper234

+0

Warto zauważyć, że jest to '(value, index)', w przeciwieństwie do 'callback' jQuery.each, które pobiera '(index, value) '. – ripper234

16

Innym rozwiązaniem byłoby:

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

Zauważ, że kolejność argumentów powinien być value, index

Docs for jQuery.grep.

Oczywiście, używając _underscore jest znacznie bardziej elegancki i wydajny (jak $ .grep stosuje predykat na wszystkich elementach tablicy, nie zatrzymuje się po pierwszym dopasowaniu) , Ale w każdym razie :)

+0

@JLRishe, dokumentacja jQuery stwierdza, że ​​zamówienie powinno mieć wartość 'value, index'. – Apelsin

+0

@Apelsin Rzeczywiście, masz rację. Głupio, musiałem założyć, że '$ .grep' jest zgodne z' $ .each'. Okazuje się, że nie są nawet trochę spójni. – JLRishe

10

Od ES2015, można użyć Array.prototype.find

przykład użycia wygląda to tak:

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

Najbardziej podoba mi się ta odpowiedź, ponieważ nie wymaga ona żadnej biblioteki ani struktury innej firmy. – northsideknight

1

niestandardowa realizacja może być rzeczywiście dość krótkie i nadal czytelny:

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

Powoduje zwrócenie pierwszego elementu zgodnego z predykatem (lub niezdefiniowanym), a następnie zatrzymuje iterację - może to być przydatne w przypadku ogromnych tablic lub gdy funkcja predykatu jest złożona.

Powiązane problemy