2014-07-19 15 views
10

Questo è solo un semplice esempio di quello che sto cercando di fare:È possibile utilizzare .contains() in un'istruzione switch?

switch (window.location.href.contains('')) { 
    case "google": 
     searchWithGoogle(); 
     break; 
    case "yahoo": 
     searchWithYahoo(); 
     break; 
    default: 
     console.log("no search engine found"); 
} 

Se non è possibile/fattibile ciò che sarebbe un'alternativa migliore?

Soluzione:

Dopo aver letto alcune delle risposte che ho trovato quanto segue per essere una soluzione semplice.

function winLocation(term) { 
    return window.location.href.contains(term); 
} 
switch (true) { 
    case winLocation("google"): 
     searchWithGoogle(); 
     break; 
    case winLocation("yahoo"): 
     searchWithYahoo(); 
     break; 
    default: 
     console.log("no search engine found"); 
} 
+0

hai provato a usare regex? –

+0

No. Dovrebbe essere 'switch (true) {case location.href.contains (" google ") ...' che è semplicemente stupido – mplungjan

+0

Sì, ma non farà quello che ti aspetti. L'espressione utilizzata per lo switch viene valutata * una volta * - in questo caso sarebbe vero/falso come risultato, non una stringa. – user2864740

risposta

7

"Sì", ma non farà quello che ti aspetti.

L'espressione usata per l'interruttore viene valutata volta - in questo caso contains vale true/false come risultato (ad esempio switch(true) o switch(false)) , non una stringa che può essere abbinato in un caso.

Come tale, l'approccio di cui sopra non funzionerà. A meno che questo modello non sia molto più grande/estensibile, basta usare semplici istruzioni if ​​/ else-if.

var loc = .. 
if (loc.contains("google")) { 
    .. 
} else if (loc.contains("yahoo")) { 
    .. 
} else { 
    .. 
} 

Tuttavia, considerare se ci fosse una funzione classify che ha restituito "Google" o "yahoo", ecc, magari utilizzando i condizionali come sopra. Quindi potrebbe essere usato in questo modo, ma è probabilmente eccessivo in questo caso.

switch (classify(loc)) { 
    case "google": .. 
    case "yahoo": .. 
    .. 
} 

Mentre le parlava sopra come in JavaScript, Ruby e Scala (e probabilmente altri) forniscono meccanismi per gestire un po 'di utilizzo "switch avanzati".

+0

Grazie per la risposta. Mi ha aiutato a trovare una soluzione, che ho aggiornato la risposta principale per contenere. – RayB

+0

@ Rayz321 Sì, anche questa è una forma possibile - non è comunque la mia preferenza/raccomandazione. – user2864740

Problemi correlati