我怎么能减少if else语句

时间:2014-01-15 09:38:45

标签: javascript php jquery

我已经编写了一个函数来在三个链接之间放置“,”和“和” 我怎么能减少if else语句。 在javascript中,如果count不为零,我会得到计数,这意味着链接必须显示,否则它应该隐藏

在以下场景中

function inst_grammer()
{
var otherCount = parseInt($('.global_other_count').html());
var initCount = parseInt($('.global_init_count').html());
var signCount = parseInt($('.global_sign_count').html());

var init_class = $('.inst_init');
var sign_class =  $('.inst_sign');

if (signCount != 0 && initCount != 0 && otherCount == 0)
{
    init_class.html('').fadeOut();
    sign_class.html(' and ').fadeIn();
} else if (signCount == 0 && initCount != 0 && otherCount != 0)
{
    init_class.html(' and ').fadeIn();
    sign_class.html('');
} else if (signCount != 0 && initCount != 0 && otherCount != 0)
{
    init_class.html(' and ').fadeIn();
    sign_class.html(' , ').fadeIn();
}
else if (signCount != 0 && initCount == 0 && otherCount == 0)
{
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
}
else if (signCount == 0 && initCount != 0 && otherCount == 0)
{
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
}
else if (signCount == 0 && initCount == 0 && otherCount != 0)
{
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
}
else if (signCount != 0 && initCount == 0 && otherCount != 0)
{
    init_class.html('').fadeOut();
    sign_class.html(' and ').fadeIn();
}
}

5 个答案:

答案 0 :(得分:4)

我认为每个人都在以错误的方式看待这个问题。它不是简化if,而是关于以语法顺序插入“,”和“和”分隔符的算法。

此问题的任何解决方案都应允许任意数量的项目(不仅仅是指定的3项)。否则,如果规范发生变化,您可能会获得大量if次测试。当然更可重复使用(即如果业务需求发生变化)。

我收集的意图是,在这个例子中,提供一个显示这些选项的显示:

  • “a,b和c”
  • “a and b”
  • “a and c”
  • “b and c”
  • “一”
  • “B”
  • “C”

所以规则是:

  • 如果显示项目数为1,则不显示分隔符
  • 如果显示项目的数量是2,则在项目之间显示“和”
  • 如果商品数量为3,则使用“,”而不是“和”,除了最后一个。

所以基本上对于n> 1,最后一个分隔符是“和”,所有其他分隔符是“,”。这个简单的规则可以应用于任意数量的项目。

您只需计算非零项目的数量即可获得此效果。  正如我在评论中提到的,将您的数据放在一个数组中,这样您就可以简单地迭代它。这意味着您的输出字段也应该在一个数组中,因此您只能按顺序显示所需的输出字段。

如果您要提供HTML示例,请尽快提供代码,但您应该能够从这些简化的规则中自行解决这个问题。:)

答案 1 :(得分:1)

您可以使用与代码的then块对应的函数发出错误, 然后像这样计算数组的索引:

$index = 4*(signCount%2) + 2*(initCount%1) + (otherCount%2);
$then[$index]();

答案 2 :(得分:0)

更新:更简单,更简单的解决方案就是连接3个变量(1表示true,0表示false):

var mycode = "" + (signCount) ? "1":"0" + (initCount)?"1":"0" + (otherCount)?"1":"0"; // Concatenate as string
switch(mycode) {
case "111":
    init_class.html(' and ').fadeIn();
    sign_class.html(' , ').fadeIn();
    break;
case "110":
    init_class.html('').fadeOut();
    sign_class.html(' and ').fadeIn();
    break;
case "101":
    init_class.html('').fadeOut();
    sign_class.html(' and ').fadeIn();
    break;
case "100":
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
    break;
case "011":
    init_class.html(' and ').fadeIn();
    sign_class.html('');
    break;
case "010":
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
    break;
case "001":
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
    break;
}

原始回答:这样可以更轻松地遵循并注意可能出现的错误:

if (signCount) {
    if(initCount) {
        if(otherCount) {
            init_class.html(' and ').fadeIn();
            sign_class.html(' , ').fadeIn();
        }
        else {
            init_class.html('').fadeOut();
            sign_class.html(' and ').fadeIn();
        }
    }
    else {
        if(otherCount) {
            init_class.html('').fadeOut();
            sign_class.html(' and ').fadeIn();
        }
        else {
            init_class.html('').fadeOut();
            sign_class.html('').fadeOut();
        }
    }
}
else {
    if (initCount) {
        if(otherCount) {
            init_class.html(' and ').fadeIn();
            sign_class.html('');
        }
        else {
            init_class.html('').fadeOut();
            sign_class.html('').fadeOut();
        }
    }
    else {
        if(otherCount) {
            init_class.html('').fadeOut();
            sign_class.html('').fadeOut();
        }
    }
}

除此之外,我担心没有简单的方法来简化这个结。

答案 3 :(得分:0)

试试这个。我刚刚使用了||对于某些条件,因为他们无论如何都在做同样的工作。

特别是这份工作

init_class.html('').fadeOut();
sign_class.html(' and ').fadeIn();

和这份工作

init_class.html('').fadeOut();
sign_class.html('').fadeOut();
在您的代码中多次调用

。所以我只使用||对于那些条件。

if ((signCount != 0 && initCount != 0 && otherCount == 0) || (signCount != 0 && initCount == 0 && otherCount != 0))
{
    init_class.html('').fadeOut();
    sign_class.html(' and ').fadeIn();
}
else if (signCount == 0 && initCount != 0 && otherCount != 0)
{
    init_class.html(' and ').fadeIn();
    sign_class.html('');
}
else if (signCount != 0 && initCount != 0 && otherCount != 0)
{
    init_class.html(' and ').fadeIn();
    sign_class.html(' , ').fadeIn();
}
else if ((signCount != 0 && initCount == 0 && otherCount == 0) || (signCount == 0 && initCount != 0 && otherCount == 0) || (signCount == 0 && initCount == 0 && otherCount != 0))
{
    init_class.html('').fadeOut();
    sign_class.html('').fadeOut();
}

答案 4 :(得分:0)

这个选项怎么样?

$arr = array(
    array( 1, 1, 1 ), array( 1, 1, 0 ), array( 1, 0, 0 ), array( 0, 0, 0 ),
    array( 0, 0, 1 ), array( 0, 1, 1 ), array( 1, 0, 1 ), array( 0, 1, 0 )
);
$option = array_search( array($signCount?1:0, $initCount?1:0, $otherCount?1:0 );

switch( $option, $arr ) ) {
    case 0:
        init_class.html(' and ').fadeIn();
        sign_class.html(' , ').fadeIn();
        break;
    case 1:
    case 6:
        init_class.html('').fadeOut();
        sign_class.html(' and ').fadeIn();
        break;
    case 2:
    case 4:
    case 7:
        init_class.html('').fadeOut();
        sign_class.html('').fadeOut();
        break;
    case 3: // none
    break;
    case 5:
        init_class.html(' and ').fadeIn();
        sign_class.html('');
        break;
}