J'ai besoin de plusieurs cas dans l'instruction switch en JavaScript, quelque chose comme:
switch (varName)
{
case "afshin", "saeed", "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
Comment puis je faire ça? S'il n'y a aucun moyen de faire quelque chose comme ça en JavaScript, je veux connaître une solution alternative qui suit également le concept DRY .
Utilisez la fonctionnalité d'abandon de l'instruction switch
. Un cas correspondant fonctionnera jusqu'à ce qu'une break
(ou la fin de l'instruction switch
) soit trouvée, vous pourrez donc l'écrire comme suit:
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
}
Cela fonctionne en JavaScript normal
function theTest(val) {
var answer = "";
switch( val ) {
case 1: case 2: case 3:
answer = "Low";
break;
case 4: case 5: case 6:
answer = "Mid";
break;
case 7: case 8: case 9:
answer = "High";
break;
default:
answer = "Massive or Tiny?";
}
return answer;
}
theTest(9);
À votre santé.
Voici une approche différente qui évite la déclaration switch
:
var cases = {
afshin: function() { alert('hey'); },
_default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();
Dans Js pour affecter plusieurs cas dans un commutateur, nous devons définir different case without break
comme indiqué ci-dessous:
<script type="text/javascript">
function checkHere(varName){
switch (varName)
{
case "saeed":
case "larry":
case "afshin":
alert('Hey');
break;
case "ss":
alert('ss');
break;
default:
alert('Default case');
break;
}
}
</script>
S'il vous plaît voir exemple cliquez sur lien
Si vous utilisez ES6, vous pouvez faire ceci:
if (['afshin', 'saeed', 'larry'].includes(varName)) {
alert('Hey');
} else {
alert('Default case');
}
Ou pour les versions antérieures de JavaScript, vous pouvez le faire:
if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
alert('Hey');
} else {
alert('Default case');
}
Notez que cela ne fonctionnera pas dans les anciens navigateurs IE, mais vous pouvez corriger les choses assez facilement. Voir la question déterminer si la chaîne est dans la liste en javascript pour plus d'informations.
En ajoutant et en clarifiant la réponse de Stefano, vous pouvez utiliser des expressions pour définir de manière dynamique les valeurs des conditions dans switch, par exemple:
var i = 3
switch (i) {
case ((i>=0 && i<=5)?i:-1): console.log('0-5'); break;
case 6: console.log('6');
}
Donc, dans votre problème, vous pourriez faire quelque chose comme:
var varName = "afshin"
switch (varName) {
case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName):
console.log("hey");
break;
default:
console.log('Default case');
}
bien que n'étant pas tellement sec ..
vous pouvez utiliser l'opérateur ' in ' ...
repose sur l'invocation d'objet/hash ...
donc c'est aussi rapide que javascript peut être ...
// assuming you have defined functions f(), g(a) and h(a,b)
// somewhere in your code
// you can define them inside the object but...
// the code becomes hard to read, I prefer this way
o = { f1:f, f2:g, f3:h };
// if you use "STATIC" code can do:
o['f3']( p1, p2 )
// if your code is someway "DYNAMIC", to prevent false invocations
// m brings the function/method to be invoked (f1, f2, f3)
// and you can rely on arguments[] to solve any parameter problems
if ( m in o ) o[m]()
Profitez, ZEE
Dans le noeud, il semble que vous soyez autorisé à faire ceci:
data = "10";
switch(data){
case "1": case "2": case "3": //put multiple cases on the same line to save vertical space.
console.log("small"); break;
case "10": case "11": case "12":
console.log("large"); break;
default:
console.log("strange");
break;
}
Cela rend le code beaucoup plus compact dans certains cas.
Ça dépend.Switch évalue une et une seule fois. En cas d’allumette, toutes les déclarations d’affaires subséquentes jusqu’à «mettre un terme au feu», peu importe ce que l’affaire dit.
var onlyMen = true;
var onlyWomen = false;
var onlyAdults = false;
(function(){
switch (true){
case onlyMen:
console.log ('onlymen');
case onlyWomen:
console.log ('onlyWomen');
case onlyAdults:
console.log ('onlyAdults');
break;
default:
console.log('default');
}
})(); // returns onlymen onlywomen onlyadults
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
Je peux voir qu'il y a beaucoup de bonnes réponses ici, mais que se passe-t-il si nous devons vérifier plus de 10 cas? Voici ma propre approche:
function isAccessible(varName){
let accessDenied = ['Liam','Noah','William','James','Logan','Benjamin',
'Mason','Elijah','Oliver','Jacob','Daniel','Lucas'];
switch (varName) {
case (accessDenied.includes(varName)?varName:null):
return 'Access Denied!';
default:
return 'Access Allowed.';
}
}
console.log(isAccessible('Liam'));
switch (myVariable)
{
case "A":
case "B":
case "C":
// Do something
break;
case "D":
case "E":
// Do something else
break;
default:
// Default case
break;
}
Dans cet exemple, si la valeur de myVariable est A, B ou C, le code sera exécuté dans la casse "C" :.
J'utilise comme ça:
switch (true){
case /Pressure/.test(sensor):{
console.log('Its pressure!');
break;
}
case /Temperature/.test(sensor):{
console.log('Its temperature!');
break;
}
}
Une des solutions possibles est:
const names = {
afshin: 'afshin',
saeed: 'saeed',
larry: 'larry'
};
switch (varName) {
case names[varName]: {
alert('Hey');
break;
}
default: {
alert('Default case');
break;
}
}
Tu peux le faire:
alert([
"afshin",
"saeed",
"larry",
"sasha",
"boby",
"jhon",
"anna",
// ...
].includes(varName)? 'Hey' : 'Default case')
ou juste une seule ligne de code:
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')
une petite amélioration par rapport à la réponse d'ErikE
Le problème avec les approches ci-dessus est que vous devez répéter plusieurs case
à chaque fois que vous appelez la fonction qui a le switch
. Une solution plus robuste consiste à avoir un map ou un dictionary .
Voici un exemple
// the Map, divided by concepts
var dictionary = {
timePeriod: {
'month': [1, 'monthly', 'mensal', 'mês'],
'twoMonths': [2, 'two months', '2 motnhs', 'bimestral', 'bimestre'],
'trimester': [3, 'trimesterly', 'quarterly', 'trimestral'],
'semester': [4, 'semesterly', 'semestral', 'halfyearly'],
'year': [5, 'yearly', 'anual', 'ano']
},
distance: {
'km': [1, 'kms', 'kilometre', 'kilometers', 'kilometres'],
'mile': [2, 'mi', 'miles'],
'nordicMile': [3, 'nordic mile', 'mil(10km)', 'scandinavian mile']
},
fuelAmount: {
'ltr': [1, 'l', 'litre', 'Litre', 'liter', 'Liter'],
'gal(imp)': [2, 'imp gallon', 'imperial gal', 'gal(UK)'],
'gal(US)': [3, 'US gallon', 'US gal'],
'kWh': [4, 'KWH']
}
};
//this function maps every input to a certain defined value
function mapUnit (concept, value) {
for (var key in dictionary[concept]) {
if (key === value ||
dictionary[concept][key].indexOf(value) !== -1) {
return key
}
}
throw Error('Uknown "'+value+'" for "'+concept+'"')
}
//you would use it simply like this
mapUnit("fuelAmount", "ltr") // => ltr
mapUnit("fuelAmount", "US gal") // => gal(US)
mapUnit("fuelAmount", 3) // => gal(US)
mapUnit("distance", "kilometre") // => km
//now you can use the switch statement safely without the need
//to repeat the combinations every time you call the switch
var foo = 'monthly'
switch (mapUnit ('timePeriod', foo)) {
case 'month':
console.log('month')
break
case 'twoMonths':
console.log('twoMonths')
break
case 'trimester':
console.log('trimester')
break
case 'semester':
console.log('semester')
break
case 'year':
console.log('year')
break
default:
throw Error('error')
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>