函数在JS中不起作用的字符串中查找正在进行的元素
Function to find proceeding element in string not working in JS
问题是取一个字符串,并为字符串中的每个字母返回字母表中的下一个字母。例如,"kick ass"应返回"ljdl btt"我已经写了这个代码,但它不起作用。也许有人能找到我的错误?
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");
使用正则表达式和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"
当前函数有很多问题。这里有一个更好的开始:
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;
}
锻炼得不错!看看:
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"));
Fiddle:http://jsfiddle.net/H5Etv/1/
也许你只需要添加一些代码就可以正确地处理空间。
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"));
使用字符串操作修改了eclanrs解决方案。如果字符串很小,请避免这种情况(使用regex、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"
工作Fiddle
jsperf
有很多方法可以实现这样的函数,但考虑到我们现在的情况,解决"也许有人能找到我的错误"这一部分可能更有指导意义。在代码中,错误多于正确,因此甚至不清楚您的意图。
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
添加到LetterChanges
。同样,strAlpha[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'
。如果您同时执行了这两项更改并将return语句移到循环之外,那么无论您传递了什么,它都会返回'bcedefghijklmnopqrstuvwxyz'
。
这里有太多的问题,我们无法告诉您应该修复什么才能使代码正常工作。你需要退后一步,看看你想做什么。
- 如何清除正在进行的所有JQuery
- 终止所有正在进行的XHR请求
- 如何避免$digest正在进行中的错误
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 如何查找正在使用的srcset的哪个候选者
- 快递:我无法获得Passport来验证登录.注册正在进行,但您可以帮助护照登录验证吗
- Twilio:第三个来电者可以闯入正在进行的通话
- 如何查找正在运行的脚本
- 如何在另一个动画正在进行时延迟运行动画
- 当我调用其他提交函数时,$anchorScroll正在进行第二次单击
- 在单击按钮时取消正在进行的 JavaScript 介绍
- 我正在进行在线测试,一切都完成了.但是我的自动提交计时器不起作用
- jQuery - 停止正在进行的动画(淡出),并在鼠标快速进入/离开时再次显示
- 正在进行DOM回流/刷新
- 正在进行中的 Ajax 请求突然开始返回状态 = 0
- AngularJS:你能得到一个'正在进行的摘要'来自多个$scope的错误$apply()调用
- 如何中止/停止正在进行的Amazon AWS s3上传
- 如何停止数据表实例已启动的所有当前正在进行的 Ajax 查询
- 函数在JS中不起作用的字符串中查找正在进行的元素
- 使用Angular.js查找正在进行的http get请求的下载状态