【问题标题】:How to do the Jquery if-else statement better如何更好地执行 Jquery if-else 语句
【发布时间】:2014-03-19 10:00:15
【问题描述】:

有没有办法改进下面的 if else 语句:

function updateStatusCount(){
    var openCount = 0;
    var ongoingCount = 0;
    var atRiskCount = 0;
    var missedCount = 0;
    var closedCount = 0;
    var onHoldCount = 0;
    $('.sr-header-status').each(function(){
        var value = $(this).html().toLowerCase();
        if(value === "open"){
            openCount = openCount + 1;
        } else if (value === "ongoing"){
            ongoingCount = ongoingCount + 1;
        } else if (value === "at risk"){
            atRiskCount = atRiskCount + 1;
        } else if (value === "missed target"){
            missedCount = missedCount + 1;
        } else if (value === "closed"){
            closedCount = closedCount + 1;
        } else if (value === "on hold"){
            onHoldCount = onHoldCount + 1;
        }
    });
    $('.statusCount').empty();
    $('.open.status_filter').find('span.statusCount').html(openCount);
    $('.ongoing.status_filter').find('span.statusCount').html(ongoingCount);
    $('.atrisk.status_filter').find('span.statusCount').html(atRiskCount);
    $('.missedtarget.status_filter').find('span.statusCount').html(missedCount);
    $('.closed.status_filter').find('span.statusCount').html(closedCount);
    $('.onhold.status_filter').find('span.statusCount').html(onHoldCount);
}

我在想这样的事情

function updateStatusCount(){
    getStatusCount("open");
    getStatusCount("ongoing");
    getStatusCount("on hold");
    getStatusCount("at risk");
    getStatusCount("missed target");
    getStatusCount("closed");
}

function getStatusCount(status){
    var count = 0;
    var statusClass = "."+status.replace(/ /g,'');
    var $statusContainer = $(statusClass).find('span.statusCount');
    $('.sr-header-status').each(function(){
        var value = $(this).html().toLowerCase();
        if(value === status){
            count = count + 1;
        }
    });
    $statusContainer.empty();
    $statusContainer.html(count);
}

但哪个更好?

谢谢

【问题讨论】:

  • 使用switch ..?
  • 你能给这段代码一些(简单/有代表性的)上下文吗?它是如何使用的(最好在您的问题中再次发布一些简单的 HTML here,并发布JS Fiddle demo)。
  • @newbie,请检查我的答案,它不使用each。您的 getStatusCount() 可以只有一行。顺便说一句,我认为您应该在代码中使用text(),而不是html()

标签: jquery


【解决方案1】:

如果您的用例有限,那么使用switch 语句似乎可以创建更简单易读的代码。我也做了一些代码重构。

function updateStatusCount(){
    var openCount = ongoingCount = atRiskCount = missedCount =
        closedCount = onHoldCount = 0;

    $('.sr-header-status').each(function(){
        switch ($(this).html().toLowerCase()) {
          case "open":          ++openCount;    break;
          case "ongoing":       ++ongoingCount; break;
          case "at risk":       ++atRiskCount;  break;
          case "missed target": ++missedCount;  break;
          case "closed":        ++closedCount;  break;
          case "on hold":       ++onHoldCount;
        }
    });
    $('.statusCount').empty(); // only need this line if there is other .statusCount not defined below
    $('.open.status_filter span.statusCount').html(openCount);
    $('.ongoing.status_filter span.statusCount').html(ongoingCount);
    $('.atrisk.status_filter span.statusCount').html(atRiskCount);
    $('.missedtarget.status_filter span.statusCount').html(missedCount);
    $('.closed.status_filter span.statusCount').html(closedCount);
    $('.onhold.status_filter span.statusCount').html(onHoldCount);
}

解决方案 2 在 jQuery 1.8+ 中你可以定义一个新的选择器:

$.expr[":"].containsNoCase = $.expr.createPseudo(function(arg) {
    return function( elem ) {
        return $(elem).text().toLowerCase().indexOf(arg.toLowerCase()) >= 0;
    };
});

或者这个,如果你的 jquery 比较老:

$.expr[':'].containsNoCase  = function(a, i, m) { 
  return $(a).text().toLowerCase().indexOf(m[3].toLowerCase()) >= 0; 
};

最后你的函数可以简化为

function getStatusCount(status){
    var statusClass = "." + status.replace(/ /g,''),
        $statusContainer = $(statusClass).find('span.statusCount');
    $statusContainer.text($('.sr-header-status:containsNoCase("' + status + '")').length);
}

【讨论】:

    【解决方案2】:

    您可以使用对象作为查找机制,让对象查找为您处理所有比较,而不是单独编码每个比较:

    function updateStatusCount(){
        var counts = {
            "open": 0, "ongoing": 0, "at risk": 0,
            "missed target": 0, "closed": 0, "on hold": 0
        }
        $('.sr-header-status').each(function(){
            counts[$(this).html().toLowerCase()]++; 
        });
        $('.statusCount').empty();
        $('.open.status_filter').find('span.statusCount').html(counts["open"]);
        $('.ongoing.status_filter').find('span.statusCount').html(counts["ongoing"]);
        $('.atrisk.status_filter').find('span.statusCount').html(counts["at risk"]);
        $('.missedtarget.status_filter').find('span.statusCount').html(counts["missed target"]);
        $('.closed.status_filter').find('span.statusCount').html(counts["closed"]);
        $('.onhold.status_filter').find('span.statusCount').html(counts["on hold"]);
    }
    

    或者,您可以通过生成您要查找的类名来变得更聪明:

    function updateStatusCount(){
        var counts = {
            "open": 0, "ongoing": 0, "at risk": 0,
            "missed target": 0, "closed": 0, "on hold": 0
        }
        $('.sr-header-status').each(function() {
            counts[$(this).html().toLowerCase()]++; 
        });
        $('.statusCount').empty();
        for (var prop in counts) {
            $("." + prop.replace(/\s/g, "") + ".status_filter" + " span.statusCount").html(counts[prop]);
        }
    }
    

    【讨论】:

    • @Leo 有时不同的人有相同的想法,同时写下他们的答案。仅仅因为他们稍后点击“发布答案”就称他们为“模仿者”是不合理的。
    • @Leo 我认为抢占社区应该做的事情并不理想。让他们决定。他们足够聪明,可以自己决定什么应该分散他们的注意力。
    • @Leo 这与“个人”无关。我告诉过你,你在那里做出了一个相当糟糕的决定是出于非常客观的原因(两个,甚至:一次是因为呼吁其他人,一次是因为承认试图影响其他人的投票方式)。下次发表评论时多考虑一下,仅此而已。
    • 好的,老大,下次我会考虑我的cmets。在此期间,你能不能(我求你)不要再提我你的 cmets,离开我,找个生活伴侣?
    【解决方案3】:

    改用switch

       $('.sr-header-status').each(function(){
        var value = $(this).html().toLowerCase();
    
    switch(value){
    case "open":
        openCount = openCount + 1;
    break;
    
    case "at risk":
        atRiskCount = atRiskCount + 1;
    break;
    
    case "missed target":
       missedCount = missedCount + 1;
    break;
    //and so on
    .......
    }});
    

    【讨论】:

    • 我很困惑。这个问题似乎很抽象,但是,既然您添加了答案,我想知道为什么它更好?为什么switchif...else 更好?它是否增加了任何性能提升或提高了代码清晰度?没看懂
    • 这不会让任何事情变得更容易。
    • 谢谢,但在我看来,它仍然与上下文无关。没有这样的函数可以被调用两次,而且我可以简单地将函数的返回值分配给一个变量,然后通过变量进行 if-else
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2019-01-24
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多