2010-10-15 9 views
37

Desidero utilizzare return false per interrompere un .each() ma anche restituire un valore allo stesso tempo. Come posso fare questo?Come uscire da .each() e restituire un valore per una funzione

Si prega di fare riferimento ad un work-around funzionare per vedere quello che sto cercando di fare:

function HasStores(state) { 
    var statehasstores = false; 

    $(stores).each(function (index, store) { 
     if (state == store.state && store.category == "meyers") { 
      statehasstores = true; 
      return false; // break 
     } 
    }); 

    return statehasstores; 
} 

Cosa Id piace fare in pseudo codice è:

Function() { 
    for() { 
     if found { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Lo sta già facendo! Guarda il mio esempio http://jsfiddle.net/aXkcW/ – BrunoLM

+0

Questo è il primo in SO che ho trovato la risposta che stavo cercando all'interno della domanda OPI chiesto lol – NecipAllef

risposta

37

Stai facendo bene ...

Citazione di http://api.jquery.com/each/

"Siamo in grado di fermare il ciclo all'interno della funzione di callback restituendo false".

+5

Che non risponde alla domanda. Vuole anche restituire un valore dopo aver restituito false, cioè distinguere 'return false' dal semplice termine del ciclo. – Ariel

+0

@ Ariel Che ne dici di https://jsbin.com/tonozu/edit?html,js,console? Il valore restituito è 'true' se la condizione è soddisfatta (proprio come i mandati pseudo-codice di OP), e si interrompe. –

+0

@ ŠimeVidas Quello (il JS, non JQ, metodo 'some') è completamente irrilevante. Sono stupito che questa risposta abbia 36 (!) Upvotes e rimanga la risposta accettata (perché l'OP può cambiarlo). Per favore vedi la mia risposta. –

2

quello che stai suggerendo è il modo per farlo Ci penserei meno come soluzione e più come un idioma.

4

In alternativa, è possibile utilizzare un ciclo for anziché each() e solo restituire il valore.

+0

Ciò renderebbe anche il codice un po 'più leggibile. – reformed

9

Utilizzare una variabile all'esterno del ciclo per ottenere il valore e utilizzarlo in seguito.

var value; 

$(stores).each(function (index, store) { 
    if(state == store.state && store.category == "meyers"){ 
     statehasstores = true; 
     value = store; // added line 
     return false; //break 
    } 
}); 

alert(value); 

Il modo in cui stai facendo va bene. I've tested on jsFiddle, see an example here.

Non funziona per voi? Puoi mostrare più contesto?

11

Sii creativo:

try { 
    $(stores).each(function (index, store) { 
    if(state == store.state && store.category == "meyers"){ 
     throw store; 
    } 
    }); 
} 
catch(e) { 
    // you got e with the value 
} 

No, stavo solo scherzando, non utilizzare questo :). È nata come un'idea che mi piaceva condividere.

+0

Mi piace l'idea. : P – BrunoLM

+3

Mi sento davvero in svantaggio di questo ... ma mi piace molto il pensiero creativo ^^ – Levit

+0

Non riesco a ricordare quale sia la vista "ortodossa" attualmente in JS per quanto riguarda l'uso di Eccezioni come tecniche di codice di routine. I "guru" di alcune lingue in certi momenti si sono dilettati con questa idea ... ma per me, essendo un sempliciotto, tendo a pensare "Eccezioni per situazioni eccezionali", o "Quando il codice fa un'eccezione a qualcosa, lancia un'eccezione" . L'unica eccezione potrebbe essere quando le alternative sono troppo complesse. Ma non è questo il caso. Una ragione pratica per evitare questo tipo di utilizzo di Eccezioni è che non si conoscono i costi generali coinvolti nell'elaborazione. –

1

Va bene Penso che c'è un piccolo dubbio su questo punto così forse sto facendo più chiaro qui:

  • Quando jquery doc dice: "Siamo in grado di fermare il ciclo all'interno della funzione di callback restituendo falso ". e tu fai:

    Funzione() { per() { se trovato { return true; }
    } return false; }

Questo non vuol dire che sei funzione restituisce vero quando trovare l'elemento cercato. Invece, restituirà sempre false.

Quindi, per rendere il vostro lavoro funzionano come lo preferite mi propongo di farlo:

Function() { 
    variable found = false; 
foreach() { 
    if found { 
     found = true; 
     return false; // This statement doesn't make your function return false but just cut the loop 
    } 
} 
return found; 

}

Naturalmente ci sono molti altri modi per eseguire questo, ma penso che questo sia il più semplice.

Coopa - Facile!

0

Come altri hanno notato da jQuery Each, restituendo false si interromperà solo dal ciclo non restituirà il valore, restituendo true tuttavia "proseguirà" e inizierà immediatamente la successiva iterazione. Con questa conoscenza, si potrebbe in qualche modo semplificare il codice come questo:

function HasStores(state) { 
    var statehasstores = false; 

    $(stores).each(function (index, store){ 

    // continue or break; 
    statehasstores = !(state == store.state && store.category == "meyers")) 
    return statehasstores; 
    }); 

    return !statehasstores; 
} 

Questo naturalmente è un po 'sciocco utilizzando la doppia negazione, e ha l'effetto collaterale di risparmio 'vero' per statehasstores per ogni falsa iterazione e il vizio versa, tuttavia il risultato finale dovrebbe essere lo stesso e non hai più quell'istruzione if.

0

ne dite:

$.each(myObj, function(key, value){ 
    ... 
    if(sthg...){ 
    myObj.somethingWentHorriblyWrong = true; 
    return false; 
    } 
}); 

if(myObj.somethingWentHorriblyWrong){ 
    // ... do something, not forgetting to go: 
    delete myObj.somethingWentHorriblyWrong; 
} 

PS Inizialmente ero interessato a quello che $.each(... restituisce in realtà. Come dice il relevant JQ page, "Il metodo restituisce il suo primo argomento, l'oggetto che è stato iterato", ma in realtà la soluzione non richiede nemmeno che tu usi quel fatto ...

PPS Serve una funzione che ritorni un valore? Avvolgere in una funzione esterna, naturalmente.

Problemi correlati