2017-02-16 53 views
0

这可能是一个愚蠢的问题,但它让我困惑。推送字符的阵列

var text = "Hello Mr Andreas Andreas Kostakis o ala krem Andreas o pianistas o poutsopnikt\o skaraveos o Andreas"; 
 
var myName = "Andreas"; 
 
var hits = []; 
 

 
for (var i = 0; i < text.length; i++){ 
 
    if (myName[0] === text[i]) 
 
    { 
 
     for (var j = i; j < (myName.length + i); j++){ 
 
      hits.push(text[j]);  
 
     } 
 
    } 
 
} 
 
for (var i = 0; i < hits.length; i++) 
 
{ 
 
    document.write(hits[i]); 
 
}

是IAM在此代码感到困惑的部分是,在第一循环的寻访MYNAME字符串的第一个字符是“A”从文本字符串。当它发现它时(在我们的例子中它会在第8次(从0开始)迭代中找到它),它进入另一个循环,我们说J = 1,所以j得到8的值,只要j这是8不等于名称字符串的长度+ 8(i)将开始从文本[8]推动字符直到它击中myName +我的长度。我的问题是在哪里命中[]阵列它会把字符?它会从命中[0]开始?当它再次找到'A'时,它会继续从那里继续吗?为什么在碰到下一个'A'字符时它不覆盖命中数组?

+2

的'.push()'函数总是添加到目标阵列的端部。 'hits'数组开始为空,所以推送的第一个字符成为第一个条目。之后,'.push()'总是在最后添加。 – Pointy

+0

不清楚!你究竟在寻找什么。 –

+0

做最后一个循环'k'而不是'i' – zer00ne

回答

0

因为数组命中[]在循环之外被初始化。第一次循环运行后,数组中已经有内容。当第二个循环运行时,它会将更多元素推送给它。 如果在循环中初始化了hits []数组,则内容将被覆盖。

Plunker:https://plnkr.co/edit/1NAkcsMuwVkXvzh4OKJP?p=preview

var text = "Hello Mr Andreas Andreas Kostakis o ala krem Andreas o pianistas o poutsopnikt\o skaraveos o Andreas"; 
var myName = "Andreas"; 
var hits_to_not_overwrite = []; 

for (var i = 0; i < text.length; i++){ 
    if (myName[0] === text[i]) { 
     var hits_to_overwrite = []; 
     for (var j = i; j < (myName.length + i); j++){ 
      hits_to_not_overwrite.push(text[j]);  
      hits_to_overwrite.push(text[j]);  
     } 
    } 
} 

document.write("<p>No overwrite:</p>"); 
for (var i = 0; i < hits_to_not_overwrite.length; i++) { 
    document.write(hits_to_not_overwrite[i]); 
} 

document.write("<p>Overwrite:</p>"); 
for (var i = 0; i < hits_to_overwrite.length; i++) { 
    document.write(hits_to_overwrite[i]); 
}