【问题标题】:Fewer lines for switch statement?switch 语句的行数更少?
【发布时间】:2012-05-20 16:18:45
【问题描述】:

我想知道这是不是……

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 && …

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

提前谢谢你!

【问题讨论】:

  • 我个人认为它比使用ifs 的一系列ORs 和ANDs 更好(会更长)

标签: javascript jquery switch-statement conditional-statements


【解决方案1】:

您可以创建一个您不想处理的键的“映射” - 映射查找应该介于 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);
});

或者,由于您的“键”都是整数,您可以填充一个数组,其中索引是键代码值。

EDIT 按照@bažmegakapa 的建议删除了字符串

【讨论】:

  • 代码的“行”数仍然不少(我的也不是),但我并不认为这是一个真正有用的目标......
  • @T.J.Crowder 将对象字面量视为“数据”而不是“代码”;-)
  • +1 应该比我的效率更高。字符串值感觉有点没必要,cmets至少可以被minifier剪掉。
  • @bažmegakapa 是的,它的值也可以为“1”,然后将其余部分作为 cmets 放入。
  • 很遗憾,没有办法创建稀疏数组字面量(即只预填充了一些数组索引)
【解决方案2】:

只需将代码放入数组中,然后您可以简单地检查值是否在数组中。由于您使用的是 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);
}

【讨论】:

    【解决方案3】:

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

    case (condition):
    //code
    break;
    

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

    【讨论】:

    • 如果 jQuery 已经可用,那么 phpjs 似乎是矫枉过正。
    • 我假设 jQuery 不存在 ;)
    【解决方案4】:

    你所拥有的一切都很好。这很清楚,并且会得到相当有效的处理。或者,您可以使用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);
        }
    });
    

    但是如果你丢失了 cmets,代码的“行”只会更少,而且 cmets 似乎(在我看来)很重要。

    请注意,一些相当老的浏览器没有Array#indexOf,因此您可能需要对其进行填充(这很容易做到)。或者改用jQuery.inArray,因为您使用的是jQuery。

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多