【问题标题】:How to split a string and repeat characters? [duplicate]如何拆分字符串并重复字符? [复制]
【发布时间】:2020-01-19 01:15:57
【问题描述】:

我正在尝试将array = ["A", "B", "C", "D"] 转换为array = ["A", "BB", "CCC", "DDDD"]。如果您比较数组,您会注意到第二个数组中的字母在每个位置都有额外的相同字母。下面是我的代码。我使用了 for 循环,因为我想在 for 循环中使用增量。我什至不知道 map() 方法是否可以做同样的事情,所以我使用了 for 循环。但是,当我检查时,它没有显示我想要的结果。我错过了什么?

function accum(s) {
  // your code
  let accArray = s.toUpperCase().split("");

  for (let i = 1; i < accArray.length; i++) {
    accArray[i].repeat(i + 1);
  }

  console.log(accArray);
}
accum("abcd")

【问题讨论】:

  • 字符串(和所有原语)是不可变的。对于repeat和replace等字符串特殊方法,返回一个new字符串,修改后的值,原字符串保持不变。
  • @VLAZ 哦,对了!我完全忘记了 repeat 返回一个新字符串。谢谢提醒!
  • @VLAZ 为什么将我的问题标记为重复?我看了另一个问题,它没有回答我的问题。另一个问题是关于 substr() 方法,而我在询问 repeat() 方法和 map() 方法。
  • 字符串是不可变的。任何“更改”字符串的方法实际上都会返回一个新字符串 - repeat、replace、substr、slice、toUpperCase 等等。这些都不会改变调用它们的字符串 - 当答案相同时,无需为这些方法中的每一个写相同的答案 - 你必须调用该方法并在某处分配值。
  • @VLAZ 确实字符串是不可变的。但是,另一个问题主要是在谈论解决方案和使用 substr()、slice() 等。实际上,另一个问题是一个广泛的问题。您提到的报价只是最佳解决方案中的一段。我的问题很具体,仅限于 map() 和 repeat() 方法。这就是与其他问题的不同之处。

标签: javascript arrays string


【解决方案1】:

实现所需输出的更简洁的方法是使用Arrow Functions:

const accum = (s) => s.toUpperCase()
                      .split("")
                      .map((s, i) => s.repeat(i + 1));
                      
console.log(accum("abcd"));

【讨论】:

    【解决方案2】:

    String.prototype.repeat()

    repeat() 方法构造并返回一个新字符串,其中包含调用它的字符串的指定数量的副本,并连接在一起。

    您必须在特定的索引处分配新的返回值:

    accArray[i] = accArray[i].repeat(i + 1);
    

    function accum(s) {
      // your code
      let accArray = s.toUpperCase().split("");
    
      for (let i = 1; i < accArray.length; i++) {
        accArray[i] = accArray[i].repeat(i + 1);
      }
    
      console.log(accArray);
    }
    accum("abcd")

    【讨论】:

      【解决方案3】:

      您需要将值推送到数组,或分配回该索引,repeat 不会改变原始值,它会返回一个新字符串 Repeat,因此您需要将其分配回

      function accum(s) {
        // your code
        let accArray = s.toUpperCase().split("");
        let op = []
        for (let i = 0; i < accArray.length; i++) {
          op.push(accArray[i].repeat(i + 1));
        }
      
        console.log(op);
      }
      accum("abcd")

      【讨论】:

      • 我发现 Mamun 的答案更好,原因是该答案利用现有变量而不是创建新变量。
      • @KrishnaPrashatt 我遵循规则不改变我的变量,除非有需要,所以我使用了不同的变量
      【解决方案4】:

      如果你的输入已经是一个类似的数组

      arr = ['a', 'b', 'c', 'd']
      

      那么你可以使用

      arr.map((item, idx) => item.repeat(idx+1))
      

      如果你有像

      这样的字符串
      str = 'abcd'
      

      那么你可以使用:

      str.split('').map((item, idx) => item.repeat(idx+1);
      

      【讨论】:

      • 显然你可以在通过上述代码之前对字符串进行大写或小写。
      【解决方案5】:

      您可以使用forEach 或map 作为迭代器完美地工作

      function accum(s) {
        // your code
        let accArray = s.toUpperCase().split("");
        const arr = [];
        accArray.forEach((e, index) => {
          arr.push(e.repeat(index + 1))
        })
      
        console.log(arr);
      }
      accum("abcd")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        相关资源
        最近更新 更多