我有一个功能就是这样做:
accum("abcd"); // "A-Bb-Ccc-Dddd"
accum("RqaEzty"); // "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
我们可以看到第一个" for"循环由它的当前(index + 1)
重复每个子串。它将它推送到数组,输出将是[ 'a', 'bb', 'ccc', 'dddd' ]
很明显,我需要迭代这个数组并将下面第二个for循环完成的每个字符串大写。
问题是,当我返回数组时,它返回如下:[ 'A', 'B', 'C', 'D' ]
它返回每个字符串的第一个子字符串,但它不会返回其余字符串。
function accum(s) {
var splitstring = s.split("")
var newarray = []
for(var i = 0; i < splitstring.length; i++) {
newarray.push(splitstring[i].repeat(i + 1))
}
for (var i = 0; i < newarray.length; i++) {
newarray[i] = newarray[i].charAt(0).toUpperCase()
}
return newarray
}
accum("abcd")
答案 0 :(得分:3)
那是因为你只用第一个字符覆盖了字符串。你需要连接字符串的其余部分。
for (var i = 0; i < newarray.length; i++) {
newarray[i] = newarray[i].charAt(0).toUpperCase() + newarray[i].slice(1);
}
以下是您的代码的较短版本:
function accum(s) {
return s.split("").map((ss, i) => ss.toUpperCase() + ss.repeat(i)).join("-");
}
console.log(accum("abcd"));
它还会添加您似乎想要的分隔符。如果您确实想要数组,请删除.join("-")
。
答案 1 :(得分:0)
无需使用第二个for
循环。只需在返回的数组上使用map()
。
function accum(s) {
var splitstring = s.split("");
var newarray = [];
for(var i= 0; i < splitstring.length; i++) {
newarray.push(splitstring[i].repeat(i + 1))
}
return newarray.map(j=>j[0].toUpperCase()+ j.slice(1)).join('-');
}
console.log(accum("abcd"));