为什么这个循环没有做我手动做的事情?

时间:2014-12-20 23:29:44

标签: javascript arrays loops for-loop

我有一个不起作用的功能:

function gapAll( ary2, ary )//perform gap() on all of the values of ary2
{
    for( i = 0; i < ary2.length; i++ )
    {
        gap( ary2[ i ], ary );
    }
}

如果我手动执行此操作,则可以:

function gapAll( ary2, ary )//perform gap() on all of the values of ary2
{
    gap( 0, ary );
    gap( 1, ary );
    gap( 2, ary );
    gap( 3, ary );
    gap( 4, ary );
    gap( 5, ary );
    gap( 6, ary );
    gap( 7, ary );
    gap( 8, ary );
    gap( 9, ary );
}

我的目标是通过循环执行此操作,而不是手动执行此操作。下面是我的所有代码......我无法弄清楚这一点......我只想循环遍历ary2的索引并将它们用于差距。我已将代码缩短为仅使用此功能使用的项目:

<!DOCTYPE html>
<html>
    <head>
        <meta charset = "utf-8">
        <title>test</title>

        <style>
            html
            {
                background-color: #0f0f0f;
                color: #ccc;

                font-family:Arial;
                font-size:90%;
            }
        </style>
    </head>

    <body>
        <header>
        </header>

        <section id = "body">
            <h3>result</h3>
            <p id = "trg">...</p>
        </section>

        <footer>
        </footer>   

        <script>
            /*|||||||||||||||||||||||||||||||||||||| BASE ARRAYS ||||||||||||||||||||||||||||||||||||||*/

            digits = [];//digits 1 - 9
            for( i = 0; i < 10; i++ )
            {
                digits.push( i );
                window[ 'digit' + i ] = 0;
            } digitsCpy = digits.slice( 0 );


            /*||||||||||||||||||||||||||||||||||||||| FUNCTIONS |||||||||||||||||||||||||||||||||||||||*/


            function gapAll( ary2, ary )//gap
            {
                for( i = 0; i < ary2.length; i++ )
                {
                    gap( ary2[ i ], ary );
                }
            }

            function gap( v, ary )//gap
            {
                v = v.toString();
                places = [];
                if( v.toString().length == 1 )  
                {
                    var counter = 0;
                    var identifier = new RegExp( v );
                    for( i = 0; i < ary.length; i++ )
                    {
                        if( identifier.test( ary[ i ] ) == true )
                        {  places.push( i ) }
                    } 

                    var gaps = places.slice( 0 );

                    for( i = 0; i < places.length; i++ )
                    {
                        if( i > 0 )
                        {
                            j = i - 1;
                            gaps[ i ] = places[ i ] - places[ j ] - 1;
                        }
                    } 

                    window[ 'digit' + v ] = gaps.slice( 0 );

                    if( window[ 'digit' + v ] == ''  )
                    { window[ 'digit' + v ] = 0; }
                }
                else if( v.toString().length == 2 )
                {
                    x = v.slice( 0, 1 );
                    y = v.slice( 1, 2 );

                    var counter = 0;
                    var identifier = new RegExp( x + ".*" + y + "|" + y + ".*" + x );
                    for( i = 0; i < ary.length; i++ )
                    {
                        if( identifier.test( ary[ i ] ) == true )
                        { places.push( i ) }
                    } 

                    var gaps = places.slice( 0 );

                    for( i = 0; i < places.length; i++ )
                    {
                        if( i > 0 )
                        {
                            j = i - 1;
                            gaps[ i ] = places[ i ] - places[ j ] - 1;
                        }
                    } 

                    window[ 'pair' + v ] = gaps.slice( 0 );

                    if( window[ 'pair' + v ] == ''  )
                    { window[ 'pair' + v ] = 0; }
                }
                else if( v.toString().length == 3 ) 
                {
                    x = v.slice( 0, 1 );
                    y = v.slice( 1, 2 );
                    z = v.slice( 2, 3 );

                    var counter = 0;
                    var identifier = new RegExp
                    ( 
                        x + ".*" + y + ".*" + z + "|" + x + ".*" + z + ".*" + y + "|" + 
                        y + ".*" + x + ".*" + z + "|" + y + ".*" + z + ".*" + x + "|" + 
                        z + ".*" + x + ".*" + y + "|" + z + ".*" + y + ".*" + x 
                    );
                    for( i = 0; i < ary.length; i++ )
                    {
                        if( identifier.test( ary[ i ] ) == true )
                        { places.push( i ) }
                    } 

                    var gaps = places.slice( 0 );

                    for( i = 0; i < places.length; i++ )
                    {
                        if( i > 0 )
                        {
                            j = i - 1;
                            gaps[ i ] = places[ i ] - places[ j ] - 1;
                        }
                    } 
                    window[ 'set' + v ] = gaps.slice( 0 );

                    if( window[ 'set' + v ] == ''  )
                    { window[ 'set' + v ] = 0; }
                }
            }

            function addDim( m )//add dimension to m
            {
                if( Array.isArray( m ) )
                {
                    for( i = 0; i < m.length; i++ )
                    {
                        if( m[ i ].length > 1 )
                        {
                            m[ i ] = m[ i ].split( '' );
                        }
                    }
                    return m;
                }
                else
                {
                    ary = m.split( ' ' );
                    return ary;
                }
            }

            /*|||||||||||||||||||||||||||||||||||||||   MAIN   ||||||||||||||||||||||||||||||||||||||||*/

            ary = [ 409,879,483,465,907,154,838,847,432,434,842,401 ];
            gapAll( digits, ary );
            document.getElementById( 'trg' ).innerHTML = digit3;
        </script>
    </body>
</html>

只是为了让这更容易理解gap( v, ary )功能的整体想法是找到&#34;差距&#34;或数组中值之间的空格。所以如果我在阵列中寻找5 [5,2,5]。 gap( 5, ary)将返回(0,1)。因为5是在第一个索引(0),然后在重复第3个索引之前跳过1个索引(2)。

这可能很简单,因为我是新手。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:7)

您的所有i变量都是全局范围的!这意味着所有for循环都使用完全相同的计数器变量,并且当您在不同函数中使用不同的循环时,它会与全局计数器状态混淆。您可以在声明局部变量时使用var关键字来解决此问题,如下所示:

function gapAll(ary2, ary) {
    for(var i = 0; i < ary2.length; i++) {
        gap(ary2[i], ary);
    }
}

您应该同样更新所有其他变量声明以使用var,否则他们将继续污染全局范围并可能导致您已经观察到的严重问题。这包括循环计数器变量和函数本地声明。

另请参阅:What is the function of the var keyword and when to use it (or omit it)?

答案 1 :(得分:4)

你的两个功能并没有做同样的事情。首先,您应该调整变量i的范围,然后您的手动版本更像

for (var i = 0; i < ary2.length; i++) {
    gap(i, ary);
}

修改

如果它与您展开的版本巧合,请使用

for (var i = 0; i < ary2.length; i++) {
    gap(ary2[i], ary);
}