是否可以将switch case用于多个array.indexOf

时间:2016-10-27 11:27:12

标签: javascript jquery arrays performance

我使用javascript

为特定数组设置了一些if条件
if (activity.indexOf("strategy session") != -1) {
    $("#FoPStrategySession").show();
}

if (activity.indexOf("sessions") != -1) {
    $("#acprojectname").show();
    if (supportmodel == "Level") {
        $(".accombohide").hide();
        $("[title='Test']").val("NA");
        $("[title='Test2']").val("NA");
    }
}

if (activity.indexOf("virtual") != -1) {
    if (supportmodel == "Level") {
        $(".lvl3_consult").hide();
        $("[title='Test']").val("NA");
        $("[title='Test2']").val("NA");
    }
}

if (activity.indexOf("Other") != -1) {
    $("#acactivityother").show();
}

有没有其他方法可以使用switch case或任何其他方法高效编写此代码?

2 个答案:

答案 0 :(得分:1)

无需多个if()switch()语句。

您可以降低圈复杂度(现在为7)并最终获得更好的代码。请注意,已经重构了一些jQuery选择器$('[title="Test"], [title="Test2"]').val('NA');并分别使用比较运算符===!==而不是==!=

  

"一段源代码的圈复杂度是通过源代码的线性独立路径数的计数。" - http://en.wikipedia.org/wiki/Cyclomatic_complexity

还创建了变量,以避免jQuery为同一选择器多次搜索DOM。

代码:

var $foPStrategySession = $('#FoPStrategySession'),
    $acprojectname =  $('#acprojectname'),
    $titleTests = $('[title="Test"], [title="Test2"]'),
    $acactivityother = $('#acactivityother'),
    $accombohide = $('.accombohide'),
    $lvl3_consult = $('.lvl3_consult'),
    obj = {
        'strategy session': function () {
            $foPStrategySession.show();
        },
        'sessions': function () {
            $acprojectname.show();
            if (supportmodel === 'Level') {
                $accombohide.hide();
                $titleTests.val('NA');
            }
        },
        'virtual': function () {
            if (supportmodel === 'Level') {
                $lvl3_consult.hide();
                $titleTests.val('NA');
            }
        },
        'Other': function () {
            $acactivityother.show();
        }
    };

    Object.keys(obj).forEach(function (o) {
        if (activity.indexOf(o) !== -1) {
            obj[o]();
        }
    });

答案 1 :(得分:1)

首先,你不应该再次查询DOM:

var strategySession = $("#FoPStrategySession");
var acprojectname = $('#acprojectname');

// and so on..

稍后您将使用上面创建的引用访问这些DOM元素。

现在,您可以使用Array.prototype.forEach来使用switch

来简化代码
activity.forEach(function(act) {
    // I suggest you that you lower case each activity
    // to avoid further issues...
    switch(act.toLowerCase())
         case "strategy session":
              strategySession.show();
              break;

         // other cases...

         default:
             throw Error("Not supported activity");
    }
});

旁注:我了解activity数组。否则,您将使用相等运算符检查activity是否为某个特定string,我的答案应该需要一些重构。如果我错误地认为activityarray ... ,请将我的回答发表评论。