Lorsque j'obtiens une valeur conditionnellement, j'aime utiliser l'opérateur ternaire (?:) pour pouvoir avoir des déclarations de variables const:

// Better
const foo = x ? 'bar' : 'goo';

// Worse
var foo;
if (x) {
    foo = 'bar';
} else {
    foo = 'goo';
}

Je voudrais faire de même pour les instructions switch. Je peux utiliser une série de ?: imbriqués, mais cela est assez lourd et ne s'adapte pas bien:

const foo = x === 1 ? 'bar' : (x === 2 ? 'goo' : 'zoo');

Je pourrais même utiliser une fermeture, mais c'est aussi détaillé:

const foo = (() => {
  switch(x) {
    case 1: 
        return 'bar';
    case 2: 
        return 'goo';
    default:
        return 'zoo';
  }
})();

Existe-t-il une switch expression en JavaScript?

4
sdgfsdh 9 août 2016 à 17:06

4 réponses

Meilleure réponse

TL; DR: Il n'y a pas une telle expression

Le ternaire est possible

La façon dont vous avez fait avec le ternaire serait la bonne approche dans ce cas. Mais comme vous avez pu le voir, cela ne se modifie pas bien.

Mais utiliser une fonction semble mieux

Un correctif consisterait à utiliser une fonction qui vous renvoie une valeur.

  function getSomething(input)
  {
     if(input == 1)
         // return for case 1
     if(input == 2)
         // return for case 2
      ...
  }
3
Dylan Meeus 9 août 2016 à 14:08

Quand ce n'est pas trop long, j'aime utiliser || et && à cet effet.

const foo = (x === 1 && 'bar') || (x === 2 && 'goo') || 'zoo'
0
Francesco 9 août 2016 à 14:33

Non. L'expression logiquement équivalente serait soit un opérateur ternaire imbriqué, comme vous l'avez indiqué, soit une construction tout aussi lourde d'opérandes booléens.

0
Xorandnotor 9 août 2016 à 14:08

Vous devez d'abord et avant tout garder les choses lisibles et gérables. La compression de deux ou trois conditions avec quatre ou cinq valeurs sur une seule ligne est illisible presque comme vous la tournez.

Je suggère cette approche très déclarative:

let fooToBarMap = {
    foo: 'bar',
    baz: 42
};

let y = fooToBarMap[x] || 'default';
4
deceze 9 août 2016 à 14:15