1 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 );
}
}
Run Code Online (Sandbox Code Playgroud)
如果我手动执行此操作,它可以工作:
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 );
}
Run Code Online (Sandbox Code Playgroud)
我的目标是通过循环执行此操作,而不是手动执行.下面是我的所有代码......我无法弄明白......我只想循环遍历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>
Run Code Online (Sandbox Code Playgroud)
只是为了让这更容易理解gap( v, ary )
函数的整体思想是在数组中找到"间隙"或值之间的空间.所以如果我在阵列中寻找5 [5,2,5].gap( 5, ary
)将返回(0,1).因为5是在第一个索引(0),然后在重复第3个索引之前跳过1个索引(2).
这可能很简单,因为我是新手.感谢您提供的任何帮助.
所有i
变量都是全局范围的!这意味着你的所有for
循环都使用完全相同的计数器变量,当你在不同的函数中使用不同的循环时,它会与全局计数器状态混淆.您可以var
在声明局部变量时使用关键字来解决此问题,如下所示:
function gapAll(ary2, ary) {
for(var i = 0; i < ary2.length; i++) {
gap(ary2[i], ary);
}
}
Run Code Online (Sandbox Code Playgroud)
您应该同样更新要使用的所有其他变量声明var
,否则它们将继续污染全局范围并可能导致严重问题,例如您已经观察到的.这包括循环计数器变量和函数本地声明.
另请参阅:var关键字的功能是什么以及何时使用它(或省略它)?