come rompere la funzione _.each in underscore.js

Sto cercando un modo per fermare le iterazioni del metodo underscore.js _.each() , ma non riesco a trovare la soluzione. jQuery .each() può interrompersi se si return false .

C’è un modo per smettere di sottolineare ogni ()?

 _([1,2,3]).each(function(v){ if (v==2) return /*what?*/; }) 

Non è ansible rompere da each metodo: emula il comportamento nativo di forEach per il metodo e nativo forEach non fornisce l’escape del ciclo (tranne il lancio di un’eccezione).

Tuttavia, ogni speranza non è persa! Puoi usare il metodo Array.every . 🙂

Da quel collegamento:

every esegue la funzione di callback fornita una volta per ciascun elemento presente nell’array finché non ne trova uno in cui il callback restituisce un valore falso. Se viene trovato un tale elemento, every metodo restituisce immediatamente false.

In altre parole, potresti fare qualcosa di complicato come questo ( link a JSFiddle ):

 [1, 2, 3, 4].every(function(n) { alert(n); return n !== 3; }); 

Ciò avviserà 1 a 3 e quindi “interromperà” dal ciclo.

Stai usando underscore.js, quindi sarai felice di apprendere che fornisce un metodo every , lo chiamano every , ma come menziona quel link, forniscono anche un alias chiamato all .

Aggiornare:

_.find sarebbe meglio quando esce dal ciclo quando viene trovato l’elemento:

 var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var count = 0; var filteredEl = _.find(searchArr,function(arrEl){ count = count +1; if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //since we are searching the first element in the array, the count will be one console.log(count); //output: filteredEl : {id:1,text:"foo"} , count: 1 

** Vecchio **

Se vuoi uscire condizionatamente da un ciclo, usa _.filter api invece di _.each. Ecco uno snippet di codice

 var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var filteredEl = _.filter(searchArr,function(arrEl){ if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //output: {id:1,text:"foo"} 

Puoi dare un’occhiata a _.some invece di _.each . _.some ferma attraversando la lista una volta che un predicato è vero. I risultati possono essere memorizzati in una variabile esterna.

 _.some([1, 2, 3], function(v) { if (v == 2) return true; }) 

Vedi http://underscorejs.org/#some

 _([1,2,3]).find(function(v){ return v if (v==2); }) 

Forse vuoi Underscore’s any () o find (), che interrompe l’elaborazione quando viene soddisfatta una condizione.

Come le altre risposte, è imansible. Ecco il commento sull’interruttore in underscore underscore issue # 21

Non è ansible interrompere un forEach in underscore, poiché emula il comportamento nativo di EcmaScript 5.

Credo che il tuo array fosse in realtà un object che potresti restituire usando un object vuoto.

 _.({1,2,3,4,5}).each(function(v){ if(v===3) return {}; }); 

È anche utile notare che non è ansible interrompere un loop per – break, utilizzare invece _.find.

http://underscorejs.org/#each

Aggiornare:

In realtà puoi “rompere” lanciando un errore dentro e catturandolo all’esterno: qualcosa del genere:

 try{ _([1,2,3]).each(function(v){ if (v==2) throw new Error('break'); }); }catch(e){ if(e.message === 'break'){ //break successful } } 

Questo ovviamente ha delle implicazioni riguardo ad altre eccezioni che il tuo codice innesca nel ciclo, quindi usa con caucanvas!

ha funzionato nel mio caso

 var arr2 = _.filter(arr, function(item){ if ( item == 3 ) return item; });