4
votes

Cas de Ruby quand vs cas de commutateur JavaScript

Je viens du monde Ruby et je suis entré dans le monde JavaScript. Une caractéristique du langage Ruby est les instructions case pour évaluer une valeur cible:

let myVal = null;
switch (myVar) {
  case "var1": 
    myVal = "value1";
    break;
  case "var2":
    myVal = "value2";
    break;
  default:
    myVal = "value3";
}

// my_val evaluated to a specific value 
console.log(myVal);

Puis-je faire quelque chose d'aussi succinct en JavaScript que ci-dessus? C'est le plus proche que j'obtiens:

my_val = case my_var
           when "var1" then "value1"
           when "var2" then "value2"
           else "value3"
         end

# my_val evaluated to a specific value 
puts my_val


3 commentaires

"case statement" - c'est en fait une expression .


Je veux juste souligner que cela fonctionne dans Coffeescript tout comme dans Ruby.


@maxpleaner Oui, je le sais aussi. Car coffeescript va de pair avec Rails. Mais il semble que coffeescript ne soit pas si populaire sur le développement frontend (React).


4 Réponses :


1
votes

Votre code fonctionne:

const obj = {
  var1: 'value1',
  var2: 'value2',
  default: 'value3'
};
const myVar = 'var1';
const myVal1 = obj[myVar] || obj.default;
const myVal2 = obj['asdfasdf'] || obj.default;

console.log(myVal1);
console.log(myVal2);

Mais un meilleur moyen sans l'instruction switch :

let myVal = null;
let myVar = 'var1';

switch (myVar) {
  case "var1": 
    myVal = "value1";
    break;
  case "var2":
    myVal = "value2";
    break;
  default:
    myVal = "value3";
}

// my_val evaluated to a specific value 
console.log(myVal);


2 commentaires

Juste une remarque sur la deuxième approche: si certains des éléments var1 , var2 , ... sont définis avec une valeur falsy (exemple < code> 0 ) dans l'objet, vous obtiendrez la valeur par défaut au lieu de celle définie falsy .


@Shidersz vous avez raison .. J'ai implémenté comme ça parce que j'utilise normalement TypeScript et comme vous pouvez le voir les var1 , var2 sont des string s .. Mais oui, tout à fait d'accord avec vous .. Merci



3
votes

Vous pouvez utiliser un objet avec un ternaire pour définir une valeur par défaut comme ceci:

const obj = {
  "var1":"value1",
  "var2":"value2",
  "defaultVal": "value3" // default value
},
getVal = sVar => sVar in obj ? obj[sVar] : obj["defaultVal"];

// Use case 1:
console.log(getVal("var1")); // get "var1" from the object

// Use case 2:
console.log(getVal("foo")); // get "foo" from the object, doesn't exsist, so we get the default value

Ce qui précède crée un objet, où chaque clé de l'objet pointe vers une valeur (c'est-à-dire en quoi myVar devrait se transformer). Si myVar n'est pas dans l'objet, il sera par défaut defaultVal , s'il est dans l'objet, il récupérera la valeur associée.


0 commentaires