Javascript 改进代码 switch 语句

标签 javascript optimization switch-statement

我正在尝试通过减少重复次数来改进我的代码。

在这里的代码中,我想避免这个切换步骤,因为除了比较运算符===!== 之外,不同的情况是相同的。

function Test(step, nb_change, name, value, previous_name){
    switch (step) {
        case 1:
            for (var i = 0; i < nb_change; i++) {
                if (name === previous_name[nb_change-1-i][1] && value === 'nd') {
                    To_change(i);
                    return true;
                }
            }
            return false;
        case 2:
            for (var i = 0; i < nb_change; i++) {
                if (name === previous_name[nb_change-1-i][1] && value !== 'nd') {
                    To_change(i);
                    return true;
                }
             }
             return false;
        case 3:
            for (var i = 0; i < nb_change; i++) {
                if (select_name !== previous_name[nb_change-1-i][1] && value !== 'nd') {
                    To_change(i);
                    return true;
                }
            }
            return false;
        default:
            alert('ERROR');
            break;
    }
}

请毫不犹豫地提出可以帮助我的解决方案。

这只是众多案例中的一个! 当我认为我的代码本来可以写得更好时,我如何寻求帮助来改进我的代码?

感谢您的帮助。

最佳答案

您可以使用接收参数的函数,该参数描述应如何处理相等性。这里我们可以利用位运算来给出想要的描述。

function Test(step, nb_change, name, value, previous_name) {
    const BOTH_EQ = 3;
    const NAME_EQ = 2;
    const NO_EQ = 0;

    switch (step) {
        case 1:
            return myFunc(BOTH_EQ, nb_change, name, previous_name, value);
        case 2:         
            return myFunc(NAME_EQ, nb_change, name, previous_name, value);
        case 3:          
            return myFunc(NO_EQ, nb_change, name, previous_name, value)
        default:
            alert('ERROR');
            break;
    }
}

function myFunc(compare, nb_change, name, previous_name, value) {
    for (var i = 0; i < nb_change; i++) {
        const first_eq = (name === previous_name[nb_change-1-i][1]) << 1;
        const second_eq = value === 'nd';

        if (compare === (first_eq | second_eq)) {
            To_change(i);
            return true;
        }
    }
    return false;
}

compare 参数传递命名常量,描述OR第一次相等比较(向左移动一位)与第二次相等比较的结果。

这是有效的,因为 true 将被强制转换为数字 1,而 false 将被转换为 0。所以我们有四种可能的结果:

true, true   == ((true << 1)  | true)  == ((1 << 1) | 1) == (0010 | 0001) == 3
true, false  == ((true << 1)  | false) == ((1 << 1) | 0) == (0010 | 0000) == 2
false, true  == ((false << 1) | true)  == ((0 << 1) | 1) == (0000 | 0001) == 1
false, false == ((false << 1) | false) == ((0 << 1) | 0) == (0000 | 0000) == 0

关于Javascript 改进代码 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46057426/

相关文章:

javascript - 从 soundcloud api 获取正确的 .mp3 url 以与 soundmanager2 360-player 一起使用

javascript - 使用 cfs 有条件调整大小 :graphicsmagick

mysql - 如何有效地创建汇总表

Objective-C (iOS/ cocoa ) : expand first letter into day of week

java - 如何在 Java 中复制此 C++ 枚举开关?

javascript - 调整@bazmegakapa 的省略号脚本以供内联使用

javascript - 增量变量在我的函数中不起作用

optimization - 如何分析和优化XSLT?

c++ - 对如何在 c++ 中编写 for 循环(包括 for all 加法)感到困惑

java - 如何让每次点击时获得不同的颜色?