javascript - 使用了很多 if 语句,我不能只使用循环吗?

标签 javascript jquery

我正在学习一些 JavaScript。目前,我已经创建了一个工作脚本,我认为该脚本的代码可以比我创建的代码小得多/更智能。

我有什么: 我有 5 个 div,有 5 个不同的 ID。 ID 为foundationPile 的div 堆叠了几张扑克牌。 HTML 看起来像这样:

   <div id="foundationPile">
       Card pile
   </div> 
       <div id="discardPile">
       Foundation 1
   </div>
    <div id="discardPile2">
       Foundation 2
   </div>
    <div id="discardPile3">
       Foundation 3<
   </div>
    <div id="discardPile4">
       Foundation 4
   </div>

我编写的代码执行以下操作:当单击foundationPile div中的卡片时,会检查discardPile1是否为空,或者(如果有卡片)检查该卡片是否低于当前卡片。如果是,则将牌推到该堆,如果没有,则检查第二堆,依此类推。

为此,我创建了包含大量 if 语句的代码:

function play( card ){  
    if( discardPile.length ){
        var lastDiscard = discardPile[discardPile.length-1];    

        if( card.val == lastDiscard.val+1 )
            discard( card );
            else if( discardPile2.length ){ //NEW START2
                var lastDiscard = discardPile2[discardPile2.length-1];  

                if( card.val == lastDiscard.val+1 )
                    discard2( card );
                    else if( discardPile3.length ){ //NEW START3
                        var lastDiscard = discardPile3[discardPile3.length-1];

                        if( card.val == lastDiscard.val+1 )
                            discard3( card );
                            else if( discardPile4.length ){ //NEW START4
                                var lastDiscard = discardPile4[discardPile4.length-1];

                                if( card.val == lastDiscard.val+1 )
                                    discard4( card );
                            }
                            else if( card.val == 1) {
                                discard4( card );
                            } //NEW END4
                    }
                    else if( card.val == 1) {
                        discard3( card );
                    } //NEW END 3

            }
            else if( card.val == 1) {
                discard2( card );       
            } //NEW END2

    }
    else if( card.val == 1) { //NEW if empty ACE is allowd 
        discard( card );            
    }
}

现在,通过循环遍历 div 的方式而不是使用 if 语句检查每个div,不是可以让我的生活更轻松吗?如果是这样,该怎么做?

这不是全部代码,我还有丢弃函数。目前我已经编写了 4 个丢弃函数。这些基本是一样的,唯一的区别是ID将卡推到哪里。我认为这也可以更容易完成。也许只需要 1 个丢弃函数并将 nr 替换为 this 左右?另外,如何做到这一点?

这些是我当前的丢弃函数:

function discard( card ){
        var el = getHtml( card );

        var card = cols[card.col].pop(); 
        var col = cols[card.col]; //NEW flip kaart eronder
        var flipCard = col[col.length-1]; //NEW flip de kaart eronder
        if( (col.length-1) > -1 ){ //NEW
                flipUp( flipCard ); //NEW
            }

        discardPile.push( card );
        card.location = 'discardPile';
        zindex( el, discardPile.length );
        if( discardPile.length > 3 )
            el.find('.back').removeClass('shadow');
        else
            el.find('.back').addClass('shadow');

        el.css("transform","translate("+discardPos.left+"px, "+discardPos.top+"px)");
    }

    function discard2( card ){ //NEW
        var el = getHtml( card );

        var card = cols[card.col].pop(); 
        var col = cols[card.col]; //NEW flip kaart eronder
        var flipCard = col[col.length-1]; //NEW flip de kaart eronder
        if( (col.length-1) > -1 ){ //NEW
                flipUp( flipCard ); //NEW
            }

        discardPile2.push( card );
        card.location = 'discardPile2';
        zindex( el, discardPile2.length );
        if( discardPile2.length > 3 )
            el.find('.back').removeClass('shadow');
        else
            el.find('.back').addClass('shadow');

        el.css("transform","translate("+discardPos2.left+"px, "+discardPos2.top+"px)");
    }

    function discard3( card ){ //NEW
        var el = getHtml( card );

        var card = cols[card.col].pop(); 
        var col = cols[card.col]; //NEW flip kaart eronder
        var flipCard = col[col.length-1]; //NEW flip de kaart eronder
        if( (col.length-1) > -1 ){ //NEW
                flipUp( flipCard ); //NEW
            }

        discardPile3.push( card );
        card.location = 'discardPile3';
        zindex( el, discardPile3.length );
        if( discardPile3.length > 3 )
            el.find('.back').removeClass('shadow');
        else
            el.find('.back').addClass('shadow');

        el.css("transform","translate("+discardPos3.left+"px, "+discardPos3.top+"px)");
    }

    function discard4( card ){ //NEW
        var el = getHtml( card );

        var card = cols[card.col].pop(); 
        var col = cols[card.col]; //NEW flip kaart eronder
        var flipCard = col[col.length-1]; //NEW flip de kaart eronder
        if( (col.length-1) > -1 ){ //NEW
                flipUp( flipCard ); //NEW
            }

        discardPile4.push( card );
        card.location = 'discardPile4';
        zindex( el, discardPile4.length );
        if( discardPile4.length > 3 )
            el.find('.back').removeClass('shadow');
        else
            el.find('.back').addClass('shadow');

        el.css("transform","translate("+discardPos4.left+"px, "+discardPos4.top+"px)");
    }

同样,我认为可以简化代码,我只是不知道如何做到这一点。如果您提供工作代码,请解释您做了什么以及为什么这样我可以从中学习

非常感谢

更新:

div 使用变量进行定位:

var wastePos = {
        'left': x_offset * (NUM_COLS-6), //NEW
        'top': 0
    };
    var discardPos = {
        'left': x_offset * (NUM_COLS-4), //NEW
        'top': 0
    };
    var discardPos2 = {
        'left': x_offset * (NUM_COLS-3), //NEW
        'top': 0
    };
    var discardPos3 = {
        'left': x_offset * (NUM_COLS-2), //NEW
        'top': 0
    };
    var discardPos4 = {
        'left': x_offset * (NUM_COLS-1), //NEW
        'top': 0
    };

最佳答案

我不确定您将如何简化所有 if 语句。然而,你的丢弃函数肯定还有优化的空间。只需将discardPile、discardPileName 和discardPos 作为附加参数传递即可。

function discard( card, myDiscardPile, discardPileName, myDiscardPos ){
    var el = getHtml( card );

    var card = cols[card.col].pop(); 
    var col = cols[card.col]; //NEW flip kaart eronder
    var flipCard = col[col.length-1]; //NEW flip de kaart eronder
    if( (col.length-1) > -1 ){ //NEW
            flipUp( flipCard ); //NEW
        }

    myDiscardPile.push( card );
    card.location = discardPileName;
    zindex( el, discardPile.length );
    if( myDiscardPile.length > 3 )
        el.find('.back').removeClass('shadow');
    else
        el.find('.back').addClass('shadow');

    el.css("transform","translate("+myDiscardPos.left+"px, "+myDiscardPos.top+"px)");
}

然后你可以这样调用它:

discard( card, discardPile2, 'discardPile2', discardPos2);

关于javascript - 使用了很多 if 语句,我不能只使用循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32822322/

相关文章:

javascript - 如何获取 select jquery 对象的选定选项的文本值?

javascript - 以所有函数都可以访问它的方式声明 Angular 变量

javascript - 具有无限列的 Bootstrap 行(动态数据) - 需要在 3 后创建新行

javascript - Highcharts:Y 轴标签上的工具提示

java - 如何使用 JQuery 和 Bootstrap 布局 json 对象数组

javascript - 迭代数组

javascript - 将表中的值拆分为不同的文本输入?

javascript - Node.js mysql错误无法读取未定义的属性?

jQuery 鼠标悬停不适用于内联 CSS

javascript - Ajax 发布数据并返回错误消息