switch语句的行数较少?

时间:2012-05-12 08:01:13

标签: javascript jquery switch-statement conditional-statements

我想知道这是不是......

inputs.keydown(function (e) {
    switch (e.keyCode) {
        case 13:    //Enter
        case 16:    //Shift
        case 17:    //Ctrl
        case 18:    //Alt
        case 19:    //Pause/Break
        case 20:    //Caps Lock
        case 27:    //Escape
        case 35:    //End
        case 36:    //Home
        case 37:    //Left
        case 38:    //Up
        case 39:    //Right
        case 40:    //Down

        // Mac CMD Key
        case 91:    //Safari, Chrome
        case 93:    //Safari, Chrome
        case 224:   //Firefox
        break;
        default:
        $(this).addClass(fill);
        break;
    }
});

...也可以用更少的线路? 我知道我可以做一个if条件,但我想知道我是否错过了case 13 && 16 && …

之类的东西

也许你们中的一些人知道更好的做法来检查所有案例并编写更少的代码行。 我只是想知道。

提前谢谢!

4 个答案:

答案 0 :(得分:8)

您可以创建一个您不想处理的键的“地图” - 地图查找应该介于O(1)O(log n)之间,具体取决于实现。

var specialKeys = {
    13: 1, // Enter
    16: 1, // Shift
    ...
    224: 1 // Cmd/FF
};

inputs.keydown(function (e) {
    if (e.keyCode in specialKeys) return;
    $(this).addClass(fill);
});

或者,因为你的“键”都是整数,你可以填充索引是关键代码值的数组。

编辑删除字符串,如@bažmegakapa

所示

答案 1 :(得分:7)

只需将代码放入数组中,然后您只需检查该值是否在数组中。由于您使用的是jQuery,因此您已经有inArray()方法来执行此操作。

var keycodes = [13, 16, 17, 18, 19]; //and so on

//if the keycode is not found in the array, the result will be -1
if ($.inArray(e.keyCode, keycodes) === -1) { 
    $(this).addClass(fill);
}

答案 2 :(得分:2)

你有什么好。很明显,它会得到相当有效的处理。或者,您可以使用Array#indexOf

执行此操作
var list1 = [
        13,    //Enter
        16,    //Shift
        17,    //Ctrl
        18,    //Alt
        19,    //Pause/Break
        20,    //Caps Lock
        27,    //Escape
        35,    //End
        36,    //Home
        37,    //Left
        38,    //Up
        39,    //Right
        40     //Down
];
var list2 = [
        91,    //Safari, Chrome
        93,    //Safari, Chrome
        224    //Firefox
];
inputs.keydown(function (e) {
    if (list1.indexOf(e.keyCode) !== -1) {
        // ...
    }
    else if (list2.indexOf(e.keyCode) !== -1) {
        // ...
    }
    else {
        $(this).addClass(fill);
    }
});

但是如果你丢失评论,那么代码的“行”就会减少,而且评论似乎(对我而言)很重要。

请注意,一些相当旧的浏览器不会有Array#indexOf,因此您可能需要对其进行填充(这很容易)。或者使用jQuery.inArray代替,因为你正在使用jQuery。

答案 3 :(得分:0)

恕我直言,使用您指出的代码更清楚,但为了您的方便,您可以使用案例中的条件......

case (condition):
//code
break;

就个人而言,我会将所有可能的匹配放入一个数组中,并使用in_array()中的phpjs.org来检查要测试的值是否存在。