2013-04-14 19 views
1

我是編程新手,目前在CodeAcademy上學習javascript。下面的代碼來自一個教程,其中程序將搜索字符串以查找名稱。該程序將遍歷數組,將每個字母與名稱的第一個字母進行比較,如果它看到該字母: 它會將該字母及其後的所有字母推到數組中,當它的字母數推送等於你名字中的字母數量。使用string.length +計數器變量

我不明白的是行:for (var j = i; j < (myName.length + i); j++) 爲什麼j <(myName.length + i)而不是j<(myName.length)?如果「Eric」的字母「E」是字符串中的第25個字符,則不會是j<(myName.length + i) = j<("4" + "25")這是錯誤的,因爲它的正確代碼應該是j<("4"),其中4是名稱Eric的長度。

我試過用j<(myName.length)來運行代碼,但它無法工作,我似乎無法理解爲什麼。

text = "Blah blah blah blah blah blah Eric \ 
     blah blah blah Eric blah blah Eric blah blah \ 
     blah blah blah blah blah Eric"; 

var myName = "Eric"; 
var hits = []; 

// Look for "E" in the text 
for(var i = 0; i < text.length; i++) { 
    if (text[i] == "E") { 
     // If we find it, add characters up to the length of my name to the array 
     for(var j = i; j < (myName.length + i); j++) { 
      hits.push(text[j]); 
     } 
    } 
} 

if (hits.length === 0) { 
    console.log("Your name wasn't found!"); 
} else { 
    console.log(hits); 
} 
+2

我在這裏看到這段代碼:http://stackoverflow.com/questions/15996731/simple-beginner-search-program-using-arrays-in-javascript-issue-with-displaying它來自哪裏? –

+1

假設你有一個字符串「哈哈埃迪哈哈哈埃裏克」,你的測試不會是錯的,因爲它發現「埃迪」之前的「埃迪」從「埃迪」發現「E」?有什麼理由不使用indexOf()方法? –

+0

代碼如果來自CodeAcademy的JavaScript教程。鏈接是http://www.codecademy.com/courses/javascript-beginner-en-XEDZA/0/1?curriculum_id=506324b3a7dffd00020bf661而且,這個字符串會在Eric之前返回Eddy。它仍然是一個初學者教程,所以我還沒學會關於indexOf()但 –

回答

2

在你的內部循環,你這樣做:

for(var j = i; 

當條件if (text[i] == "E") {得到滿足的i的價值是非常高的(30)。現在

當你這樣做:

for(var j = i; j < (myName.length); j++) { 

你基本上是這樣 -

for(var j = 30; j < 4; j++) { 

所以從未開始循環;因爲邊界條件不滿意。

但是當你這樣做:

for(var j = i; j < (myName.length+i); j++) { 

,那麼你這樣做是:

for(var j = 30; j < (30+4) ; j++) { 

因此一切正常,它應該的方式。

+0

明白了!非常感謝你的解釋清楚! –

1

我希望你不要在你未來的項目:)

text = 'Blah blah blah blah blah blah Eric blah blah blah Eric blah blah Eric blah blah blah blah blah blah blah Eric'; 
var hits = text.match(/Eric/g) || []; 
if (hits.length) { 
    console.log('Your name was found ' + hits.length + ' times'); 
} 
else { 
    console.log('Your name wasn\'t found!'); 
} 
0

如果我理解正確使用上面的代碼,你的作品呈現正確的代碼,你不明白爲什麼?如果是這樣,這裏是我的解釋:

ij標記位置在textifor(var i = 0; i < text.length; i++) {中初始化爲零。循環的工作方式是根據條件i < text.length;評估i,如果它是真的,那麼它將運行代碼塊,執行你的迭代器(i++,這意味着給我加1),然後開始循環再次評估狀況。

您會注意到j初始化爲i而不是零。所以會發生的是,如果字符串text的位置i上的字母是「E」,那麼它將開始另一個循環,將j設置爲i(因此在上述情況中爲25),然後重複名稱的長度。而且我相信,這個條件就是會造成困惑:

for(var j = i; j < (myName.length + i); j++) {

所以讓我穿行在這個循環會發生什麼:

首先它將設置j當前位置在text,其中方便i知道。假設i已達到25.因此,循環通過ij設置爲25。現在既然我們想要下一個四個字符,而不是第一個四個字符的text,條件設置爲j < (myName.length + i)

由於 「埃裏克」 是四個大字,這將增加text[25]text[26]text[27],並text[28]hits。如果你去看看texts,你會發現第25到第28封信是(應該是)你的名字。