【问题标题】:Is it possible to use switch case for more than one array.indexOf是否可以对多个 array.indexOf 使用 switch case
【发布时间】:2017-03-10 01:40:44
【问题描述】:

我有一些使用 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 或任何其他方法编写此代码吗?

【问题讨论】:

  • 您希望这些关键字中的多个出现在数组中吗?数组有多大?
  • 按照我的口味,我认为您的代码没有问题。没有太多的重复,很容易阅读
  • 尝试在codereview.stackexchange.com 发布此内容。这是关于效率改进问题的适当地方。
  • @Bergi :该数组大约有 10-12 个项目。
  • @Eliran Malka :我也会尝试在那里发帖

标签: javascript jquery arrays performance


【解决方案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]();
        }
    });

【讨论】:

  • 这既不更具可读性,也更高效,甚至与 OP 中的代码相同。
  • @Bergi 你能再检查一下吗
  • 更改相等运算符可能会提高效率,但会改变意图。 ===== 对程序流的影响非常不同(是否内聚......),不能互换使用。
  • 是不是说上面的代码和我写的差不多?
  • @Yosvel Quintero :感谢您的代码,现在我发现也很容易维护。
【解决方案2】:

首先,您不应该重新查询 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,请注释掉我的答案...

【讨论】:

  • 那么用这个方法,是不是效率更高,行数也会减少对吧?
  • 如果一个项目在数组中出现多次,则在循环中使用switch 将执行与原始代码不同的操作。
  • @Bergi 好吧,它会多次陷入相同的情况......我不知道这是否是 OP 的问题
猜你喜欢
  • 2018-08-18
  • 2016-04-09
  • 2021-12-20
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2021-11-03
相关资源
最近更新 更多