我正在尝试编写一个以字符串为参数的函数, 并且输出应该是相同的字符串,每个字符重复字符索引多次,并大写第一个字母。
例如,函数accum(abc)
应该返回:A-Bb-Ccc
accum(zytx)
应该返回:Z-Yy-Ttt-Xxxx
我尝试了以下代码,但无法正常工作。有人可以帮我吗?
function accum(s) {
var strSplit = s.toLowerCase().split('');
var newArr = strSplit.map((element, i) =>
element.repeat(i+1).charAt(0).toUpperCase()+element.substr(1));
console.log("the new Arr is: "+newArr.join('-'));
return newArr.join('-');
}
accum("abcd");
答案 0 :(得分:5)
采用实用样式(感谢@Redu进行评论)
const accum = (s) => Array.from(
s,
(c, i) => `${c.toLocaleUpperCase()}${c.repeat(i)}`
)
.join('-');
console.log(accum(''));
console.log(accum('a'));
console.log(accum('xyz'));
您的代码不起作用,因为在此行
element.repeat(i+1).charAt(0).toUpperCase()+element.substr(1))
element.substr(1)
尝试获取从单个字符的索引1(始终为空字符串)开始的子字符串。您可能认为element.repeat(i+1)
可以在适当的地方起作用(即修改element
),而它返回一个新字符串(请参见MDN)。
您可以按以下步骤解决此问题:
function accum(s) {
var strSplit = s.toLowerCase().split('');
var newArr = strSplit.map((element, i) =>
`${element.toLocaleUpperCase()}${element.repeat(i)}`);
console.log("the new Arr is: "+newArr.join('-'));
return newArr.join('-');
}
accum("abcd");
答案 1 :(得分:2)
问题在于您的.charAt(0)
始终采用第一个字符,并且此后不再重复小写字母。
function accum(s) {
var strSplit = s.toLowerCase().split('');
var newArr = strSplit.map(
(element, i) => element.toUpperCase()+element.repeat(i));
return newArr.join('-');
}
console.log("the new Arr is:", accum("abcd"));
console.log("zytx:", accum("zytx"));
您可以通过删除.substr()
并仅放置element.repeat(i)
来进一步简化此操作。在第一次迭代中,i
将为0,并返回一个空字符串。
答案 2 :(得分:2)
这也可以使用简单的正则表达式和repeat
来实现,如:
function accum(s) {
var i = 0;
return s.replace(/./g, m => "-" + m.toUpperCase() + m.repeat(i++)).slice(1);
}
console.log(accum("abcd"));
slice(1)
部分用于从字符串的开头删除-
。