我如何根据字符串中的索引多次重复一个字符串

时间:2018-08-26 11:27:06

标签: javascript string

我正在尝试编写一个以字符串为参数的函数, 并且输出应该是相同的字符串,每个字符重复字符索引多次,并大写第一个字母。

例如,函数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");

3 个答案:

答案 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)部分用于从字符串的开头删除-