我正在尝试解决这个练习,目标是给我一个必须转换成另一个字符串的字符串。新字符串的字符将重复,如下例所示。
实施例:
accum("abcd"); // "A-Bb-Ccc-Dddd"
我写了以下代码:
function accum(s) {
counter = 0;
for (var i = 0; i < s.length; i++) {
return s[i].toUpperCase() + s[i].repeat(counter) + "-";
counter += 1;
}
}
当我尝试运行ZpglnRxqenU
等示例测试时,我收到此错误:
预期:'Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuu',而得到:'Z-'。
显然问题与循环无关,但我无法弄清楚原因。
答案 0 :(得分:3)
这是ES6单行:
const accum = word => word.toLowerCase().split("").map( (letter,index) => letter.toUpperCase() + letter.repeat(index) ).join("-")
console.log( accum("ZpglnRxqenU") )
说明:
word.split("")
首先将字符串分解为字母数组.map( (letter,index) =>
迭代每个字母,随时跟踪索引letter.toUpperCase() + letter.repeat(index)
将每个字母替换为您返回的转换后的值.join("-")
将所有内容连接回字符串,并以“ - ”作为分隔符。 答案 1 :(得分:2)
您可以结合使用这些方法:String.prototype.split(),Array.prototype.map()和Array.prototype.join():
function accum(s) {
return s
.split('')
.map(function (e, i) {
return e.toUpperCase() + e.repeat(i);
})
.join('-');
}
console.log(accum('ZpglnRxqenU'));
&#13;
ES6:
const accum = s => s.split('').map((e, i) => e.toUpperCase() + e.repeat(i)).join('-');
console.log(accum('ZpglnRxqenU'));
&#13;
答案 2 :(得分:1)
你可以这样做:
function accum(s) {
s = s.toLowerCase();
const letters = [];
for (let i = 0; i < s.length; i++) {
letters.push(s[i].toUpperCase() + s[i].repeat(i));
}
return letters.join('-');
}
console.log(accum('ZpglnRxqenU'));
你有一个数组,并用字母填充它,一旦填充,你加入元素' - '。您可以将字母添加到字符串中,但最后您必须修剪尾随的“ - ”,这没有错,但现在您有2种方法可以执行此操作。
此外,您不需要counter
变量,因为i
已经在计算。
答案 3 :(得分:0)
这对你有用。当t
循环停止时。你需要删除它。
return
答案 4 :(得分:0)
使用array.reduce:
var str = "abcd";
function accum(str) {
var arr = str.split("");
return arr.reduce((m, o, i) => {
m += (i === 0 ? "" : "-") + o.toUpperCase() ;
for (var k = 0; k < i; k++) {
m += o;
}
return m;
}, "");
}
var ret = accum(str);
console.log(ret);
&#13;