2016-09-01 60 views
0

我想通過名稱'bob'的'文本'變量來查看,並計算我找到它的次數。當將文本與名稱'bob'進行比較時,我發現自己需要使用toLowerCase,因爲b!= B。但是當循環嘗試將空格轉換爲小寫時失敗。我可以在這裏使用什麼樣的LowerCase替代方案?

我該怎麼辦?此外,我會很感激任何改進我的代碼的建議 - 我仍然是初學者。

var text = "Hey, how are you doing? My name is Bob. I like to sleep. Bob"; 
 

 
var myName = "bob"; 
 
var temp = []; 
 
var lower = ''; 
 
var count = 0; 
 
var hits = 0; 
 

 
var valid = function(letter) { 
 

 
    if (myName[count] == undefined) { 
 
    count = 0; 
 
    } 
 

 
    var 
 
    let = letter.toLowerCase(); 
 

 
    if (let === myName[count]) { 
 
    temp.push(let); 
 
    count++; 
 
    } else { 
 
    count = 0; 
 
    temp.pop(let); 
 
    return false; 
 
    } 
 

 
    if (myName == temp.join("")) { 
 
    hits += 1; 
 
    temp = []; 
 
    } 
 

 
}; 
 

 
for (i = 0; i < text.length; i++) { 
 

 
    if (text[i] === "b") { 
 

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

 
     lower = text[j].toLowerCase(); 
 

 
     if (valid(lower) == false) { 
 
     break; 
 
     } 
 
    } 
 
    } 
 
} 
 

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

+2

'let'在較新的JS,所以我不會把它作爲鑑於OP的需求變量名 – epascarello

回答

1

在這種情況下,最好是使用正則表達式來找到您需要的文字:

var re = /(bob)/gi; 
var str = 'Hey, how are you doing? My name is Bob. I like to sleep. Bob\nHey, how are you doing? My name is Bob. I like to sleep. Bob\nHey, how are you doing? My name is Bob. I like to sleep. Bob\nHey, how are you doing? My name is Bob. I like to sleep. Bob\n'; 
var m; 

while ((m = re.exec(str)) !== null) { 
    if (m.index === re.lastIndex) { 
     re.lastIndex++; 
    } 
    // View your result using the m-variable. 
    // eg m[0] etc. 
} 
+0

似乎只是計數的出現也意味着,難道你不能用類似'(str.match(re)|| []).''替換'while'循環嗎? – nnnnnn

2

您得到特定的錯誤是Uncaught TypeError: Cannot read property 'toLowerCase' of undefined。發生這種情況是因爲在內部for循環中,您正在運行text字符串的末尾。您需要檢查j < text.length

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

你知道text[j]將有一個定義的值,因此text[j].toLowerCase()將工作和你的代碼運行的方式。

我覺得你有一些其他的邏輯錯誤,但我沒有時間好好調試它適合你,尤其是當你的需求可以在一個線路中實現通過使用.split()用正則表達式:

hits = text.split(/\bbob\b/i).length-1; 

還是一個更有活力的版本:

var text = "Hey, how are you doing? My name is Bob. I don't like bobbing. Bob"; 
 
var myName = "bob"; 
 

 
var hits = text.split(new RegExp("\\b" + myName + "\\b","i")).length-1; 
 
console.log(hits);

注意,正則表達式是匹配使用\b以便它將匹配'Bob'而不是'bobbing' - 如果您要想要匹配'bobbing',那麼只需使用text.split('bob').length-1即可。

還請注意,通過使用帶有i標誌的正則表達式,它會進行不區分大小寫匹配。

0

這裏是這樣做的另一種方式:

var text = "Hey, how are you doing? My name is Bob. I like to sleep. Bob"; 
var myName = "bob"; 
var re = new RegExp("\\b"+myName+"\\b","ig"); // \b==wordBoundary;i==igonoreCase;g==searchMultiple; 
var m = text.match(re); 
if (m==null) { 
    console.log("Your name wasn't found!"); 
    console.log(0); 
} else { 
    console.log(m.length); 
} 
相關問題