为什么for循环不起作用?

时间:2014-08-12 22:49:38

标签: javascript string

我正在研究一个问题,请问我:

将每个单词的第一个字母移到其末尾,然后在单词的末尾添加“ay”。

pigIt('Pig latin is cool'); //igPay atinlay siay oolcay

这是我现在的代码,它只返回第一个单词,尽管它使用了for循环。这可能是一个愚蠢的错误,但我只是有点卡在这里,非常感谢你帮助检查代码。(可能只是我一直在看它太久了,一双新眼睛肯定会抓到这个bug )

function pigIt(str) {

str = str.split(" ")
 for(var i = 0;i<str.length;i++)
 return str[i].slice(1)+str[i][0]+"ay"
}

console.log(pigIt('Pig latin is cool'))

而且我认为我的解决方案可以使用嵌套的地图功能进行简化,但我的尝试并不成功;你们中的任何人都能想出更好的解决方案吗?

谢谢你们。

更新:

所以这是我正在寻找的工作地图代码,比我原来的解决方案要好得多:

 function pigIt(str){
 return str.split(' ').map(function(el){
  return el.slice(1) + el.slice(0,1) + 'ay';
  }).join(' ');
 }

如果其他人偶然发现了这个问题,并希望使用简化的代码来解决问题。

3 个答案:

答案 0 :(得分:6)

您在return循环中使用for,因此它执行第一次迭代,然后......返回。

您需要将内容推送到数组,然后将数组连接回字符串。

答案 1 :(得分:2)

我想使用正则表达式分享一个版本,以提供此问题的侧视图。

正则表达式,如:/(\w)(\w+)/g

  • \w =将匹配[a-zA-Z0-9_]中任何字词的第一个字母,如果有必要排除_,则数字可以更好[a-zA-Z] 1}}
  • (\w+) =会匹配[a-zA-Z0-9_]中任何单词字符的其余部分,如果有必要排除_,则数字可以更好[a-zA-Z]

示例:

"Pig latin is cool".replace(/(\w)(\w+)/g,"$2$1ay") //returns igPay atinlay siay oolcay

也会产生预期的结果。

  • $1 代表第一组(\w)
  • $2 代表第二组(\w+)
  • ay是需要添加到每个单词的表达式。

也是原型方法的一个很好的候选者:

String.prototype.igPay = function () {
    return this.replace(/(\w)(\w+)/g,"$2$1ay");
}
"Pig latin is cool".igPay();

演示:http://jsfiddle.net/cytms60c/

答案 2 :(得分:1)

你走了:

var str = 'pig latin is cool',
    strArr = [];

str.split(' ').forEach(function (piece, index, arr) {
    piece = piece.slice(1) + piece[0] + 'ay';
    strArr.push(piece);
});

alert(strArr.join(' '));

演示:http://jsfiddle.net/6fdx2mcs/