JavaScriptのswitchステートメントには複数のケースが必要です。
switch (varName)
{
case "afshin", "saeed", "larry":
alert('Hey');
break;
default:
alert('Default case');
break;
}
どうやってやるの? JavaScriptでそのようなことをする方法がない場合は、 DRY concept に続く代替ソリューションを知りたいです。
switch
ステートメントのフォールスルー機能を使用してください。一致したケースはbreak
(またはswitch
ステートメントの終わり)が見つかるまで実行されます。
switch (varName)
{
case "afshin":
case "saeed":
case "larry":
alert('Hey');
break;
default:
alert('Default case');
}
これは通常のJavaScriptで動作します
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);
乾杯。
これはswitch
ステートメントを完全に回避する異なるアプローチです。
var cases = {
afshin: function() { alert('hey'); },
_default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;
cases[ varName ] ? cases[ varName ]() : cases._default();
Jsではswitchに複数のケースを割り当てるために、以下のようにdifferent case without break
を定義する必要があります。
<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>
link をクリックしてください。
ES6を使用している場合は、これを実行できます。
if (['afshin', 'saeed', 'larry'].includes(varName)) {
alert('Hey');
} else {
alert('Default case');
}
あるいは、以前のバージョンのJavaScriptでは、これを実行できます。
if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
alert('Hey');
} else {
alert('Default case');
}
これは古いIEブラウザでは動作しませんが、かなり簡単にパッチを当てることができます。 javascriptのリストに文字列が含まれているかどうかの判断 を参照してください。
Stefanoの答えを追加して説明すると、式を使用してswitchの条件の値を動的に設定できます。
var i = 3
switch (i) {
case ((i>=0 && i<=5)?i:-1): console.log('0-5'); break;
case 6: console.log('6');
}
だからあなたの問題では、次のようにすることができます:
var varName = "afshin"
switch (varName) {
case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName):
console.log("hey");
break;
default:
console.log('Default case');
}
そんなに乾いていないが..
' in '演算子を使えます。
はobject/hash呼び出しに依存しています...
JavaScriptと同じくらい速いので...
// 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]()
お楽しみください、ZEE
ノードでは、これを行うことが許可されているようです。
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;
}
場合によっては、これによりコードがはるかにコンパクトになります。
依存します。 Switch は一度だけ評価されます。一致すると、それ以降のすべてのcaseステートメントは、そのケースが何を言っても、 'break'になります。
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>
ここにはたくさんの良い答えがありますが、10以上のケースをチェックする必要がある場合はどうなりますか?これが私自身のアプローチです。
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;
}
この例では、myVariableの値がA、B、またはCの場合、ケース「C」のコードを実行します。
私はこのように使用します:
switch (true){
case /Pressure/.test(sensor):{
console.log('Its pressure!');
break;
}
case /Temperature/.test(sensor):{
console.log('Its temperature!');
break;
}
}
可能な解決策の1つは次のとおりです。
const names = {
afshin: 'afshin',
saeed: 'saeed',
larry: 'larry'
};
switch (varName) {
case names[varName]: {
alert('Hey');
break;
}
default: {
alert('Default case');
break;
}
}
あなたはこれを行うことができます:
alert([
"afshin",
"saeed",
"larry",
"sasha",
"boby",
"jhon",
"anna",
// ...
].includes(varName)? 'Hey' : 'Default case')
または1行のコードで
alert(["afshin", "saeed", "larry",...].includes(varName)? 'Hey' : 'Default case')
erikEの答えから少し改善
上記のアプローチの問題点は、case
を持つ関数を呼び出すたびに、いくつかのswitch
を繰り返す必要があることです。より堅牢な解決策は map または dictionary を持つことです。
ここでの例
// 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>