【问题标题】:Why doesn't this loop do what I can do manually?为什么这个循环不能做我可以手动做的事情?
【发布时间】:2014-12-20 23:29:44
【问题描述】:

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

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 ) 函数的整个想法是找到“间隙”或数组中值之间的空间。所以如果我在数组 [5, 2, 5] 中寻找 5。 gap( 5, ary) 将返回 ( 0, 1 )。因为 5 在第一个索引 (0) 处,然后在第三个索引处重复之前跳过了 1 个索引 (2)。

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

【问题讨论】:

  • 你可以先声明i
  • 从@U2744SNOWFLAKE 继续 - 在你的循环声明中,你应该有var i 而不仅仅是i

标签: javascript arrays loops for-loop


【解决方案1】:

您所有的 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)?

【讨论】:

  • 没有意识到远离全局变量的重要性,我将我所有的 for( i 更改为 for( var i,它就像一个魅力。谢谢!
【解决方案2】:

你的两个函数没有做同样的事情。首先,您应该将变量 i 限定为范围,然后您的手动版本会更像

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

编辑

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

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

【讨论】:

  • 问题是i 在我的代码中并不总是等于ary[ i ]。在我的示例中确实如此,但我还有其他数组,其中 i 的值不完全等于索引。
  • 您能否为手册发布一个不同的场景,以显示 i 与 ary[i] 不同的情况
  • @carb0nshel1 已编辑。听起来展开的版本是巧合。
  • ary2[ i ] 将是ary2 中该索引的值。在这种情况下,我用gapAll( digits, ary );(在我的代码底部)调用gapAll 函数。数字数组从字面上看是 [ 0, 1, 2, 3, 4, 5 - 等 ] 一直到 9。但是,如果我与另一个数组交换数字,我正在使用称为 pairs 的另一个数组。它行不通。 pair = [ 00, 01, 02, etc ] 一直到 99。
猜你喜欢
  • 2011-07-14
  • 2011-02-02
  • 1970-01-01
  • 2018-05-26
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多