3


这在我正在处理的项目中出现过几次,我如何“测试”一个开关以确定它是否有一个案例而不实际执行它?

如果必须运行该案例,是否有有效的检查方法?

先感谢您。

IE

if (runSwitch(switch.hasCase("casename2"))) {
    alert("I've got it!");
}
else {
    alert("nope");
}

function runSwitch(case) {
    switch (case) { // Any way to skip the function?
        case "casename0" : alert("case"); break;
        case "casename1" : alert("case"); break;
        case "casename2" : alert("case"); break;
        case "casename3" : alert("case"); break;
    }
}
4

3 回答 3

5

无论您要检查每个案例,因此通过交换机运行它是最佳选择。如果您只想在运行之前检查案例是否存在,请将它们添加到数组并检查索引是否存在。

var cases = ['case1', 'case2'];
if (cases.IndexOf('case1') >= 0) {
    // the case is there
}
于 2012-11-19T02:23:16.943 回答
0

我知道确定 switch 是否有你的情况的唯一方法是实际运行 case 语句。如果您想知道 case 块是否实际运行,您可以返回一个布尔值。

function runSwitch(_case) {
    var hasCase = false;
    switch(_case) {
        case 'casename0': hasCase = true; alert('case'); break;
        case 'casename1': hasCase = true; alert('case'); break;
        case 'casename2': hasCase = true; alert('case'); break;
        case 'casename3': hasCase = true; alert('case'); break;
        default: break;
    }
    return hasCase;
}

然后,您可以使用以下命令运行该语句:

if(runSwitch('casename4')) {
    //The case statement ran
}
else {
    //The case statement did not run
}
于 2012-11-19T02:20:49.907 回答
0

由于大卫施瓦茨没有发布答案,我将发布我的解决方案(这几乎不是解决方案)以及我理解的他的解决方案的演示和解释。

我的解决方案:

我只是停止使用开关并切换到 JSON(数组),因为我的开关的唯一目的是根据输入设置变量。

使用数组时,检查“case”是否存在很容易(只需 run arrayVar["casename"],如果不存在则返回 undefined )并且您不需要用额外的变量堵塞命名空间,运行代码稍微多一点困难,因为它需要作为字符串和evaled 提供,但总的来说这对我来说效果更好。

无需发布演示或代码,因为它确实不是解决此问题的方法。

大卫施瓦茨的解决方案:

演示:http: //jsfiddle.net/SO_AMK/s9MhD/

代码:

function hasCase(caseName) { return switchName(caseName, true); } // A function to check for a case, this passes the case name to switchName, sets "just checking" to true and passes the response along
function runSwitch(caseName) { switchName(caseName); } // This is actually a mostly useless function but it helps clarify things

function switchName(caseName, c) { // And the actual function, c is the "just checking" variable, I shortened it's name to save code
    switch(caseName) { // The switch
        case "casename0" : if (c) return true; alert("case"); break; // If c is true return true otherwise continue with the case, returning from inside a case is the same as calling break;
        case "casename1" : if (c) return true; alert("case"); break;
        case "casename2" : if (c) return true; alert("case"); break;
        case "casename3" : if (c) return true; alert("case"); break;
        default: if (c) return false; break; // If nothing else ran then the case doesn't exist, return false
    }
    return c; // Even I (:D) don't understand where this gets changed, but it works
}

说明:根据需要对上面的代码进行注释。​</p>

于 2012-11-19T21:16:51.823 回答