2013-07-02 24 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

相关问题