2012-07-05 13 views
16

Esiste una funzione esistente che trova il primo elemento dell'array che corrisponde ad un predicato generale?Dato un array e un predicato, trovare il primo elemento corrispondente

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

Non credo, l'id più vicino $ .grep che corrisponde a tutti contro un predicato –

risposta

11

Se si utilizza underscore.js, allora si potrebbe utilizzare find metodo. Funziona anche con oggetti jQuery che memorizzano la raccolta di elementi senza problemi.

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

Ma oltre a questa libreria aggiuntiva (ma piccola) è necessario scriverla da solo.

+0

Sembra buono. Si scopre che stiamo già usando il trattino basso, quindi è ancora più facile. Ecco il documento per chiunque sia interessato: http://underscorejs.org/#find – ripper234

+0

Vale la pena notare che è '(valore, indice)', in opposizione al callback di 'jQuery.each' che accetta' (indice, valore) '. – ripper234

16

Un'altra soluzione potrebbe essere:

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

Nota che l'ordine degli argomenti dovrebbe essere value, index

Docs for jQuery.grep.

Naturalmente, utilizzando _underscore è molto più elegante ed efficiente (come $ .grep applica il predicato su tutti gli elementi dell'array, non si ferma dopo la prima corrispondenza) , Ma in ogni caso :)

+0

@JLRishe, la documentazione di jQuery afferma che l'ordine dovrebbe essere "valore, indice". – Apelsin

+0

@Apelsin In effetti, hai ragione. Silly me, devo aver pensato che '$ .grep' fosse coerente con' $ .each'. Si scopre che non sono nemmeno leggermente coerenti. – JLRishe

10

Come di ES2015, è possibile utilizzare Array.prototype.find

Un esempio di utilizzo è simile a questo:

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

Mi piace questa risposta la migliore perché non richiede alcuna libreria o framework di terze parti per funzionare. – northsideknight

1

personalizzato implementazione potrebbe essere in realtà molto breve e ancora leggibile:

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

Questo restituisce il predicato di corrispondenza dell'elemento prima (o non definito) e quindi interrompe l'iterazione - questo potrebbe essere utile per enormi matrici o se la funzione di predicato è complessa.

Problemi correlati