22

Mi piacerebbe ottenere qualcosa come _.first con _.filter, ovvero, avendo una raccolta di elementi, vorrei ottenere il primo (se esiste) che corrisponde a una verità test (iteratore).Ottieni il primo elemento di una raccolta che corrisponde alla funzione iteratore

Per esempio, dato un array simile al seguente:

var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}] 

vorrei getthe primo (e unico per primo) elemento che soddisfa la mia funzione personalizzata:

_.filterFirst(arr, function(el) { return el.a > 10; }); // make it 

Finora:

_.first(arr) == {a:1} 
_.filter(arr, function(...)) == [{a:11}, {a:15}] 

c'è una soluzione pulita per fare questo che è meglio di _.first(_.filter(arr, iterator))?

+1

Dai un'occhiata alla funzione find http://underscorejs.org/#find –

+0

Perché non solo _.filter (arr, iterator) [0] – levi

+1

@levi perché consuma più CPU di quanto dovrebbe. – ducin

risposta

51

È possibile utilizzare find:

guarda attraverso ogni valore nella lista, restituendo il primo che passa un test di verità (iterator), o non definito se nessun valore supera il test . La funzione ritorna non appena trova un elemento accettabile, e non attraversa l'intero elenco.

Usando il tuo esempio:

var g = _.find(arr, function (x) { return x.a > 10 }) 

vedere la pagina principale: http://underscorejs.org

Un'altra cosa da notare (che potrebbe essere la tua domanda) è la funzione chain per partecipare alle chiamate insieme:

var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value() 

Notare le chiamate a filter e "prima" che possono seguire ciascuna r senza alcun nidificazione.

+1

con precisione! '_.find' è ciò di cui ho bisogno! – ducin

+0

... o Array.prototype.find(), ma non è supportato da IE. Si può usare un polyfill però. Si noti che la semplice conversione di ES2015 + in ES5 non sarebbe sufficiente. –

1

"_.find" è una buona soluzione.

Una soluzione alternativa, forse più veloce, è quello di utilizzare "Array.prototype.every" in questo modo:

var match; 
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; }) 
Problemi correlati