Javascript中的函数切换语句

Javascript中的函数切换语句,javascript,switch-statement,Javascript,Switch Statement,假设我有一个switch语句,它接受一个介于1和某个较大值之间的变量myData,即300 根据“状态代码”变量,结果是另一个变量的文本值。例如,如果myData==1,我想返回一个名为code1的变量。如果myData==300,我想返回一个名为code300的变量。Code1和code300变量存储不相关的字符串,即“这是一个摘要”或“这是一个注释”。以下是一些psuedo代码: var myData = statusCode; var code1 = "This is a summary

假设我有一个switch语句,它接受一个介于1和某个较大值之间的变量myData,即300

根据“状态代码”变量,结果是另一个变量的文本值。例如,如果
myData==1
,我想返回一个名为
code1
的变量。如果
myData==300
,我想返回一个名为
code300
的变量。Code1和code300变量存储不相关的字符串,即“这是一个摘要”或“这是一个注释”。以下是一些psuedo代码:

var myData = statusCode;

var code1 = "This is a summary";
var code300 = "This is a note";

switch(myData) {
    case statusCode:
        scriptletResult = returnCode("code", statusCode); // code1 if myData == 1
        break;          
    default:
        scriptletResult = code1;
}

function returnCode(code, statusCode) {
    return code + statusCode; // Returns a variable "code1" if statusCode == 1
}
我怎样才能让它工作

var myData=300;
var code1="This is a summary";
var code300=" this is a note";
var result=(function(){
switch(myData) {
case 1:
    return code1;        
case 300:
   return code300,
default:
    return "not defined";
}
})();

alert(result);
IIFE+开关组合的完美用例

但最好是:

alert([code1,code2][myData]);
IIFE+开关组合的完美用例

但最好是:

alert([code1,code2][myData]);

您需要使用查找映射,而不是多个变量:

var codes = {
    1: "This is a summary",
    300: "This is a note"
};
有了它,你就可以做到

if (statusCode in codes) {
    scriptletResult = codes[statusCode];
} else {
    scriptletResult = codes[1];
}

您需要使用查找映射,而不是多个变量:

var codes = {
    1: "This is a summary",
    300: "This is a note"
};
有了它,你就可以做到

if (statusCode in codes) {
    scriptletResult = codes[statusCode];
} else {
    scriptletResult = codes[1];
}

@Bergi的答案是最好的方法,但如果您无法更改代码消息组合的存储方式,并且变量是全局变量,则可以使用:

scriptletResult=window["code"+myData];

@Bergi的答案是最好的方法,但如果您无法更改代码消息组合的存储方式,并且变量是全局变量,则可以使用:

scriptletResult=window["code"+myData];

允许lambda模式匹配的Javascript函数切换语句

const switchF=(c,options,def)=>{
const choice=options.find(([key,])=>{
if(Array.isArray(键)){
返回键indexOf(c)>=0;
}
如果(键的类型==“函数”){
返回键(c);
}
返回键===c;
});
如果(!choice)返回def();
const[,choiceVal]=选择;
if(typeof choiceVal==“函数”)返回choiceVal();
if(typeof choiceVal==“string”){
返回开关F(选择值、选项、定义);
}
抛出错误(“开关F失败!”);
};
示例用法:


常量切换器=(c)=>
开关(
C
[
[“foo”,()=>“foo选项”],
[“酒吧”、“美食”],
[(v)=>v>3,()=>99],
],
()=>“默认值”
);
console.log(切换器(“foo”);//返回“Foo”
console.log(切换器(“条”);//返回“Foo”
console.log(切换器(4));//返回'99'
console.log(切换器(2));//返回“默认值”
控制台日志(切换器(“zzz”);返回“默认值”

允许lambda模式匹配的Javascript函数切换语句

const switchF=(c,options,def)=>{
const choice=options.find(([key,])=>{
if(Array.isArray(键)){
返回键indexOf(c)>=0;
}
如果(键的类型==“函数”){
返回键(c);
}
返回键===c;
});
如果(!choice)返回def();
const[,choiceVal]=选择;
if(typeof choiceVal==“函数”)返回choiceVal();
if(typeof choiceVal==“string”){
返回开关F(选择值、选项、定义);
}
抛出错误(“开关F失败!”);
};
示例用法:


常量切换器=(c)=>
开关(
C
[
[“foo”,()=>“foo选项”],
[“酒吧”、“美食”],
[(v)=>v>3,()=>99],
],
()=>“默认值”
);
console.log(切换器(“foo”);//返回“Foo”
console.log(切换器(“条”);//返回“Foo”
console.log(切换器(4));//返回'99'
console.log(切换器(2));//返回“默认值”
控制台日志(切换器(“zzz”);返回“默认值”


codeX变量是原样的,还是可以将它们移动到以代码为键的对象中?它们是原样的,预定义的。您需要的是变量,在Javascript中不起作用。明智的做法是让数组或对象从键映射到值,这样你就可以做一个简单的
code[myData]
。你完全可以有变量——使用
window[variableName]
(数组语法)@Feathercrown假设所有必需的
code
变量都是全局变量,但
codeX
变量是原样的,还是可以将它们移动到以代码为键的对象中?它们是原样的,预定义的。您需要的是变量,在Javascript中不起作用。明智的做法是让数组或对象从键映射到值,这样你就可以做一个简单的
code[myData]
。你完全可以有变量——使用
window[variableName]
(数组语法)。@Feathercrown假设所有需要的
code
变量都是全局变量,尽管
[‘这是一个摘要',…][myData]| |“未定义”
…@deceze他想要一个函数开关语句。不是说这是有用的…不管“函数切换语句”的确切含义是什么…:P
[‘这是一个摘要’,…][myData]| |“未定义”
。@deceze他想要一个函数切换语句。不是说这是有用的…不管“函数切换语句”的确切含义是什么…:p这是最好的解决方案,但我相信OP说他出于某种原因不能移动变量。据我所知,这是最接近我想要实现的。这并没有改变人们必须编写300个“代码”字符串的事实,但它确实减少了所需的switch语句的数量…@Scott在这种情况下,
var-codes={1:code1300:code300}
可能是一个解决方案。或者
eval
,在最坏的情况下使用一个变量名白名单(-regex)。这是最好的解决方案,但我相信OP说出于某种原因他不能移动变量。据我所知,这是最接近我想要实现的。这并没有改变人们必须编写300个“代码”字符串的事实,但它确实减少了所需的switch语句的数量…@Scott在这种情况下,
var-codes={1:code1300:code300}
可能是一个解决方案。或者
eval
,在最坏的情况下使用变量名的白名单(-regex)。