2013-07-02 25 views
0

問題是要取一個字符串並返回字母表中每個字母的下一個字母。例如。 「踢屁股」應該返回「ljdl btt」 我寫了這段代碼,但它不起作用。也許有人可以找到我的錯誤?在字符串中找不到工作元素的函數JS

function LetterChanges(str) { 

    var LetterChanges = "";  
    var stringlength = str.length-1; 
    var strAlpha = "abcdefghijklmnopqrstuvwxyz"; 
    for (var i=0; i<strAlpha.length; i++) { 
    if (strAlpha < strAlpha[i].length){ 
     LetterChanges += strAlpha[i] +1; 
     }     
    return str; 
    } 
} 

LetterChanges("hello there");   
+0

爲什麼要退* *那? –

+1

你的函數沒有看'str'的​​內容。 – Barmar

+0

你的邊界條件是什麼(即* z *)?大寫字母,數字和其他字符怎麼樣? – Phil

回答

5

你可以用正則表達式和replace做到這一點很容易:

var str = 'kick azZ'.replace(/[a-z]/gi, function(c){ 
    if (c=='z') return 'a'; 
    if (c=='Z') return 'A'; 
    return String.fromCharCode(c.charCodeAt(0) + 1); 
}); 

console.log(str); //= "ljdl baA" 
+0

哇..解決方案! –

+0

@elclanrs你會解決與大字符串的規模?就我的經驗而言,正則表達式在性能方面表現不佳。我可能是錯的。 – Tushar

+0

這不能很好地處理角落案例。 'z'變成了'{','''變成了'/'... –

0

有很多的問題,您的當前功能。這裏有一些更好的你開始:

var alphabet = "abcdefghijklmnopqrstuvwyz"; 

function translate(str) { 
    var result = ""; 

    for (var i = 0; i < str.length; i++) { 
     var char = str.charAt(i); 
     var index = alphabet.indexOf(char); 

     // You'll have to find the next character in alphabet 
     // Use the modulo operator (%) to handle "z" -> "a" 

     result += nextChar; 
    } 

    return result; 
} 
0

很好的鍛鍊!檢查出來:

function LetterChanges(str) { 

    var result = [], 
     strAlpha = "abcdefghijklmnopqrstuvwxyz"; 

    for(var i=str.length;i--;){ 
     var char = str[i], 
      strIndex = strAlpha.indexOf(char), 
      newIndex = (strIndex < strAlpha.length-1) ? strIndex +1 : 0; 

     result.unshift(strAlpha[newIndex]); 
    } 

    return result.join(''); 
} 

alert(LetterChanges("hello there")); 

小提琴:http://jsfiddle.net/H5Etv/1/

也許您只需要添加一些代碼正確處理的空間。

0
function LetterChanges(str) { 

    var LetterChanges = "";  
    var stringlength = str.length-1; 
    var strAlpha = "abcdefghijklmnopqrstuvwxyz"; 
    var n = 0; 
    for (var i=0; i<stringlength; i++) { 
    if(str[i] != ' ') { 
    n=strAlpha.indexOf(str[i]); 
    LetterChanges += strAlpha[n+1]; 
    }else{ 
    LetterChanges += ' '; 
    } 
    }  
    return LetterChanges; 

} 

document.write(LetterChanges("hello there")); 
0

有很多方式可以實現這樣的功能,但由於我們這裏得到的,它可能是更有益的解決部分「也許有人能找到我的錯誤」。通過你的代碼,有更多的錯誤比權利,所以它甚至不明確你的意圖。

var stringlength = str.length-1; 

這很奇怪,我們不知道你在這裏嘗試達到什麼目的。 stringlength從未在函數中使用:

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

您正在遍歷字母表。我有一種感覺,你想迭代你的輸入參數str

if (strAlpha < strAlpha[i].length){ 

這很奇怪。目前還不清楚你想在這裏測試什麼。您目前正在檢查字母表(字符串,始終是相同的值)是否小於(即按字母順序排列)字母位置i處的字符length。由於i在字母表範圍內,因此strAlpha[i]將始終只返回一個字符。 strAlpha[i].length只能是1或拋出異常。現在,由於您將字符串與數字值1進行比較,字符串比較將是一個小於條件的數字。你的情況幾乎總是說if('abc...' < 1)這永遠不會是真的。

LetterChanges += strAlpha[i] +1; 

如果你的代碼進入狀態,它會遇到這種情況。將strAlpha[i]+1添加到LetterChangesstrAlpha[i]再次是i位置的字母表。對於i = 0,strAlpha[i] = 'a''a' + 1 = 'a1'。你遍歷整個字母表;如果你的情況評估爲真,你最終會得到LetterChanges = 'a1b1c1...'。在這裏,我假設你的意思是strAlpha[i+1],它會在位置i+1處產生字母表的字母。您仍然遍歷整個字母表,最終會將所有字符向上移動一個位置,即LetterChanges = 'bce...'

return str; 

最後,返回字符串。這裏有兩個問題。主要的一點是你可以在沒有碰過它的情況下返回輸入參數str。你會一直返回你傳遞給函數的任何東西。你的意思是return LetterChanges;?第二個問題是,你回到它for循環,這意味着它會在第一次迭代,i=0退出功能,返回無論是在過去。

如果在此變更爲return LetterChanges;狀態,它會返回一個空字符串。如果您更改了條件以使其評估爲true並更改爲return LetterChanges;,它將返回'b'。如果你做了這兩個更改並將循環語句移出循環外部,它將返回'bcedefghijklmnopqrstuvwxyz',無論你傳遞了什麼內容。

這裏有很多問題,我們無法告訴你應該修復哪些內容以使代碼正常工作。你需要退後一步,看看你想要做什麼。

0

使用字符串操作修改eclanrs解決方案。如果字符串很小(避免使用正則表達式,eclanrs解決方案)。

var str = 'kick azz'; 
var rStr = ""; 
var t = str.split(' '); 
for (var i = 0; i < t.length; i++) { 
    var x = t[i]; 
    if (i > 0) { 
     rStr += " "; 
    } 
    for (var j = 0; j < x.length; j++) { 
     var k = String.fromCharCode(x[j].charCodeAt(0) + 1); 
     if (x[j] == "z") { 
      k = "a"; 
     } else if (x[j] == "Z") { 
      k = "A"; 
     } 
     rStr += k; 
    } 
    t[i] = x; 
} 
str = rStr; 
console.log(str); //= "ljdl btt" 

Working Fiddle

jsperf

相關問題