Javascript 我如何减少if-else语句

Javascript 我如何减少if-else语句,javascript,php,jquery,Javascript,Php,Jquery,我写了一个函数来放置“,”和“和”之间的三个链接 如何减少if-else语句。 在javascript中,若count不为零,我就得到count,这意味着链接必须显示,否则它应该隐藏 在下面的场景中 function inst_grammer() { var otherCount = parseInt($('.global_other_count').html()); var initCount = parseInt($('.global_init_count').html()); var si

我写了一个函数来放置“,”和“和”之间的三个链接 如何减少if-else语句。 在javascript中,若count不为零,我就得到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();
}
}

您可以使用与代码块对应的函数出错, 然后计算数组的索引,如下所示:

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

更新:一个更简单的解决方案是将3个变量串联在一起(1表示真,0表示假):

原始答案:这很容易理解,并注意到可能出现的错误:

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();
        }
    }
}

除此之外,恐怕没有简单的方法来简化这个结。

试试这个。我只是用| |来表示一些条件,因为它们做的是相同的工作

特别是这份工作

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();
}
这个选择怎么样

$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;
}

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

此问题的任何解决方案都应考虑任意数量的项(而不仅仅是指定的3项)。否则,如果规范发生变化,您可能会得到大量的
if
测试。当然更易于重用(即,如果业务需要更改)。

我认为,在本例中,目的是提供一个显示以下选项的显示:

  • a、b和c
  • “a和b”
  • “a和c”
  • “b和c”
  • “a”
  • “b”
  • “c”
因此,规则是:

  • 如果显示项目数为1,则不显示分隔符
  • 如果显示项目数为2,则在项目之间显示“和”
  • 如果项目数为3,则使用“,”代替“和”,最后一个项目除外
所以基本上对于n>1,最后一个分隔符是“and”,所有其他分隔符是“,”。这个简单的规则可以应用于任意数量的项目

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


如果您愿意提供一个HTML示例,那么很乐意提供代码,但您应该能够根据这些简化规则自己解决这一问题。:)

使用switch语句。@MahmoodRehman也许您应该提供一个如何打开3个变量组合的示例?将它们放入数组并使用循环。。。这只是一个简单的问题,在所选项目和淡出值为0的元素之间添加“and”。我想减少代码,可能的重复。您是否实际计算了由此生成的组合数?他想简化他的代码。@TrueBlueAussie:当然。8种组合。还有几个具有相同的操作现在如果您添加此解决方案所需的其余代码,我们可以看到它实际上是否更少代码?:)这似乎几乎不可能调试。是的,相同的结果scnerios应该在else语句中。您的开关假设它们的计数只有0或1(我收集到它们的值为0或更大)。OP只对值不同于0的情况感兴趣,因此这似乎是有效的。在答案中添加了值到布尔值的转换。谢谢。很高兴合并相同的结果。(y) +1用于解决根本问题,而不是效果。
$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;
}