web-dev-qa-db-fra.com

Est-il possible d'utiliser .contains () dans une instruction switch?

Ceci est juste un exemple simple de ce que j'essaie de faire:

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

Si ce n'est pas possible/faisable, quelle serait une meilleure alternative?

Solution:

Après avoir lu certaines des réponses, j'ai trouvé que ce qui suit était une solution simple.

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");
}
21
RayB

"Oui", mais il ne fera pas ce que vous attendez.

L'expression utilisée pour le commutateur est évaluée ne fois - dans ce cas contains est évalué comme vrai/faux comme résultat (par exemple switch(true) ou switch(false)), pas une chaîne pouvant être mise en correspondance dans un cas.

En tant que tel, l'approche ci-dessus ne fonctionnera pas. À moins que ce modèle ne soit beaucoup plus grand/extensible, utilisez simplement des instructions if/else-if simples.

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

Cependant, considérez s'il y avait une fonction classify qui renvoyait "google" ou "yahoo", etc., en utilisant peut-être des conditions comme ci-dessus. Ensuite, il pourrait être utilisé comme tel, mais est probablement exagéré dans ce cas.

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

Alors que ce qui précède en discute en JavaScript, Ruby et Scala (et probablement d'autres) fournissent des mécanismes pour gérer une utilisation plus "de commutateur avancé").

16
user2864740

Une implémentation alternative pourrait être celle-ci. Pas grand-chose dedans mais lit mieux que switch (vrai) ...

const href = window.location.href;
const findTerm = (term) => {
  if (href.includes(term)){
    return href;
  }
};

switch (href) {
  case findTerm('google'):
      searchWithGoogle();
      break;
  case findTerm('yahoo'):
      searchWithYahoo();
      break;
  default:
      console.log('No search engine found');
};
2
TimT