2015-10-17 86 views
3

我試圖用字母后面的字母替換字符串中的每個字母。JavaScript將字符串中的每個字母替換爲字母后面的字母錯誤

例如:

a -> b 
b -> c 
c -> d 

等。

function LetterChanges(str) { 
    for (var i = 0; i < str.length; i++) { 
     if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
      str = str.replace(str.charAt(i), String.fromCharCode(str.charCodeAt(i) + 1)); 
     } 
    } 
    return str; 
} 

所以我測試了一些字符串輸入,我的「鱈魚」有錯誤,我的代碼返回「環保署」,而不是「DPE」,能有人幫我修復它?

謝謝。

回答

0

在循環播放時更改str並不是一個好主意。

這裏是適用的功能,將工作。

function LetterChanges(str) { 
    var strOut=''; 
    for (var i = 0; i < str.length; i++) { 
     if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
      strOut += String.fromCharCode(str.charCodeAt(i) + 1); 
     } 
    } 
    return strOut; 
} 
3

由於您的replace不限於在字符串中的特定位置,它會在每次更換第一匹配的字符。 (它不會取代全部,因爲它沒有設置g修飾符。)因此,首先將您的領先c替換爲d,下一輪將o替換爲p - 然後在第三輪中,當您的輸入已經是dpd,因此您獲得epd,因爲第一個d已被替換爲e

這會更容易些,如果你沒有使用replace,而只是建立一個字符串,你追加對當前輸入的字符每次匹配的「下一個」字符,然後在結束時,您只需返回新的字符串。

編輯:

此外,您目前的實現不處理z正確的,因爲它與「下」字{替換它,而應該寧可是一個a。而Z則變爲[,應改爲A。在Za之間,還有一些非字母字符,您可能不想替換。

這裏是一個函數,實現了我上面的建議,並且也需要zZ,以及非字母考慮:

function LetterChanges(str) { 
    var result = ""; 
    for (var i = 0; i < str.length; i++) { 
     // handle "z" 
     if (122 == str.charCodeAt(i)) { 
      result += "a"; 
     // handle "Z" 
     } else if (90 == str.charCodeAt(i)) { 
      result += "A"; 
     // handle all other letter characters 
     } else if ((65 <= str.charCodeAt(i) && str.charCodeAt(i) <= 89) || 
        (97 <= str.charCodeAt(i) && str.charCodeAt(i) <= 121)) { 
      result += String.fromCharCode(str.charCodeAt(i) + 1); 
     // append all other characters unchanged 
     } else { 
      result += str.charAt(i); 
     } 
    } 
    return result; 
} 

console.log(LetterChanges("AaZz+cod!foo")); // output: BbAa+dpe!gpp 

http://jsfiddle.net/hvyft64p/3/

if ((65 <= str.charCodeAt(i) && str.charCodeAt(i) <= 89) || 
    (97 <= str.charCodeAt(i) && str.charCodeAt(i) <= 121)) 

我用八十九分之六十五和97/121,和<=這裏進行比較,因爲從邏輯的角度來看,這對我來說更有意義 - 這些是我們想要考慮的實際「邊界」字母,A/Y和d a/y,所以使用這些數字直接使代碼更具可讀性。

+0

非常感謝你的明確書面解釋! – Jackie

3

讓我們來看看代碼將與輸入cod做:

  • 過程c,在字母一個字母爲d,更換cd,結果是dod
  • 過程o,在字母一個字母是p,更換爲op,結果是dpd
  • 過程d,在字母一個字母是e,更換de,結果是epd

您看到在步驟3的錯誤? replace用您使用它的方式替換字母的第一次出現。一種解決方案是通過向其附加下一個字母來創建新的字符串。例如:

var newString = ''; 
for (var i = 0; i < str.length; i++) { 
    if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
     newString += String.fromCharCode(str.charCodeAt(i) + 1); 
    } 
} 
return newString; 

順便說一句,你的代碼也有一個細微的錯誤。如果您的字符串包含z它將被替換爲{。您可能想回到字母表的開頭,並在此情況下將其替換爲a

+0

爲什麼你使用一個數組作爲'newString'而不是一個字符串? –

+0

@QuentinRoy更新。可能是更好的解決方案來使用String。也許還[更快](https://jsperf.com/string-concat-vs-array-join-10000/2)。謝謝 –

0

看起來像一個典型的切扎爾的密碼給我(較低alplha和右移)

function cezarCipher(str,step){ 
var res=""; 
step=step%26; //make sure the step is in range 
for(var i=0,j=str.length;i<j;i++){ 
    var nextCode=str.charCodeAt(i)+step; 
    if(nextCode>122){ 
     nextCode=96+(nextCode-123+1); 
    } 
    res+=String.fromCharCode(nextCode); 
} 
return res; 
} 

使步= 1,讓您的結果。

相關問題