2013-07-20 179 views
0

我正在運行以下代碼以獲取顯示單詞Eric字母的相關輸出。Javascript for loop&arrays

/*jshint multistr:true */ 

text = "My name is Eric. Eric lives in New York"; 
var myName = "Eric"; 
var hits = []; 

for (var i=0; i < text.length; i++) { 
    if (text[i] == "E") { 
     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); 
} 

我能夠獲得所期望的輸出,該輸出[ 'E', 'R', 'I', 'C', 'E', 'R', 'I', 'c' 的]

然而,當我在我的代碼行8進入「L」我得到以下輸出: [ 'L', '我', 'v', 'E', 'S' ,'','我']

根據我的理解,代碼應該會返回一條消息您的名字沒有被發現!

相反,它仍在處理字母l之後的字符,並將其作爲輸出返回。

如何以更好的方式優化我的代碼以確保只搜索字符串Eric中的字符並將其作爲輸出返回,而其他字符將被拒絕?

+1

爲什麼應該說這個名字是不是發現了什麼?你的代碼中沒有什麼比較'myName'和文本。它所做的就是使用'myName.length'作爲'for'循環的限制的一部分,但它對'myName'中的字符沒有任何作用。 – Barmar

+0

爲什麼不使用'text.indexOf(myName)'如果你想知道名稱是否在文本中找到? – Barmar

+0

我測試了你的代碼,它不像你說的那樣。 – NPE

回答

0

字符串不是字符數組。爲了從該位置的字符串得到一個字符,你需要使用charAt方法,像這樣:

if (text.charAt(i) == "E") { 
    //... 
} 

甚至更​​好:

if (text.charAt(i) == myName.charAt(0)) { 
    //... 
} 
1

這將是一噸更容易使用正則表達式在這種情況下:

var name = "Eric"; 
var text = "My name is Eric. Eric lives in New York"; 
var hits = []; 
var regexp = new RegExp(name, "g"); 
var match; 
while (match = regexp.exec(text)) { 
    hits.push(match[0]); 
} 
console.log(hits); 

當使用exec與「G」標誌,每一個電話的進步字符串中的位置。所以在第一次迭代時,你會得到第一個Eric,然後第二個會找到下一個,依此類推。有關更多信息,請參閱mdn

在這個循環之後,命中將是一個字符串「Eric」的數組。如果你想要的字符數組就像你以前,你可以使用一個簡單的黑客:

while (match = regexp.exec(text)) { 
    hits = hits.concat([].slice.call(match[0])); 
} 

或者,如果你想直接使用循環:

while (match = regexp.exec(text)) { 
    for (var i = 0; i < match[0].length; i++) { 
     hits.push(match[0][i]); 
    } 
} 
0

使用的indexOf的一個很好的例子()來找到字符串occurances位置爲:https://stackoverflow.com/a/3410557/2577572

上面鏈接會給你的,你所搜索的字符串的位置陣列的例子的結果。如果在調用上面詳述的函數後數組沒有長度,則找不到您的名字。

我不認爲你需要真正建立從搜索字符串由字母數組,因爲根據你的榜樣,他們將是相同的每一次搜索字符串。

2

如果Eric完全匹配,那麼只有它將它放入數組中。

如(埃裏克是數組,但Eriic不是)

工作演示http://jsfiddle.net/9UcBS/1

text = "My name is Eric. Eric lives in New York Eriic"; 
var myName = "Eric"; 
var hits = []; 

var pos = text.indexOf(myName); 
while (pos > -1) { 
    for (var j = pos; j < (myName.length + pos); j++) { 
     hits.push(text[j]); 
    } 
    pos = text.indexOf(myName, pos + 1); 
} 
(hits.length === 0) ? console.log("Your name wasn't found!") : console.log(hits);