由於您的replace
不限於在字符串中的特定位置,它會在每次更換第一匹配的字符。 (它不會取代全部,因爲它沒有設置g
修飾符。)因此,首先將您的領先c
替換爲d
,下一輪將o
替換爲p
- 然後在第三輪中,當您的輸入已經是dpd
,因此您獲得epd
,因爲第一個d
已被替換爲e
。
這會更容易些,如果你沒有使用replace
,而只是建立一個新字符串,你追加對當前輸入的字符每次匹配的「下一個」字符,然後在結束時,您只需返回新的字符串。
編輯:
此外,您目前的實現不處理z
正確的,因爲它與「下」字{
替換它,而應該寧可是一個a
。而Z
則變爲[
,應改爲A
。在Z
和a
之間,還有一些非字母字符,您可能不想替換。
這裏是一個函數,實現了我上面的建議,並且也需要z
和Z
,以及非字母考慮:
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,所以使用這些數字直接使代碼更具可讀性。
非常感謝你的明確書面解釋! – Jackie