我有一个不起作用的功能:
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)。
这可能很简单,因为我是新手。感谢您提供的任何帮助。
答案 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);
}