【问题标题】:Repeat a string in JavaScript a number of times在 JavaScript 中重复一个字符串多次
【发布时间】:2010-12-25 01:12:10
【问题描述】:

在 Perl 中,我可以使用以下语法多次重复一个字符:

$a = "a" x 10; // results in "aaaaaaaaaa"

有没有一种简单的方法可以在 Javascript 中实现这一点?我显然可以使用一个函数,但我想知道是否有任何内置方法或其他一些巧妙的技术。

【问题讨论】:

    标签: javascript string character repeat


    【解决方案1】:

    为了好玩,这里有另一种方式,使用toFixed(),用于格式化浮点数。

    通过做

    (0).toFixed(2)
    (0).toFixed(3)
    (0).toFixed(4)
    

    我们得到

    0.00
    0.000
    0.0000
    

    如果前两个字符0.被删除,我们可以使用这种重复模式来生成任何重复。

    function repeat(str, nTimes) {
      return (0).toFixed(nTimes).substr(2).replaceAll('0', str);
    }
    
    console.info(repeat('3', 5));
    console.info(repeat('hello ', 4));

    【讨论】:

      【解决方案2】:

      如今,repeat string method几乎无处不在。 (是not in Internet Explorer。)所以除非你需要支持旧的浏览器,你可以简单地写:

      "a".repeat(10)
      

      repeat 之前,我们使用了这个hack:

      Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"
      

      (请注意,长度为 11 的数组只能得到 10 个“a”,因为 Array.join 将参数放在 数组元素之间。)

      Simon 还指出,根据this benchmark,在 Safari 和 Chrome(但不是 Firefox)中,通过简单地附加一个 for 循环来多次重复一个字符似乎更快(虽然不太简洁)。

      【讨论】:

      • 另外,您可以使用变量而不是固定长度 - Array(20-len),例如将字符串填充到 20。
      • 循环方法可能更快但更冗长。另外,我对第一条评论的所有赞成票感到困惑,考虑到当数组长度可变时这通常很有用,例如Array(rawValue.length + 1).join("*")
      • 公式为Array(n+1).join("a")。当 n=0 时,返回空字符串,当 n=1 时,返回"a"。所以我认为它适用于所有情况。
      • @Bashir 是正确的,IE 不支持这个:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
      • @Neel 那是因为 JS 引擎对字符串长度施加了限制。在 Chrome 和 Firefox 中,该限制接近 2^30(约十亿)。 10^12 是一万亿。
      【解决方案3】:

      右填充零,没有数组或循环。只需使用 repeat() 使用 ES6 2015,它现在有 wide support。如果您切换串联,则左焊盘。

      function pad(text, maxLength){ 
        var res = text + "0".repeat(maxLength - text.length);
        return res;
      }
      
      console.log(pad('hello', 8)); //hello000
      

      【讨论】:

        【解决方案4】:

        这是调用函数并通过 Array() 和 join() 获取结果的方法

        function repeatStringNumTimes(str, num) {
          // repeat after me
          return num > 0 ? Array(num+1).join(str) : "";
        }
        
        console.log(repeatStringNumTimes("a",10))

        【讨论】:

          【解决方案5】:

          如果你经常重复自己的话会很方便:

          String.prototype.repeat = String.prototype.repeat || function(n){
            n= n || 1;
            return Array(n+1).join(this);
          }
          
          alert(  'Are we there yet?\nNo.\n'.repeat(10)  )

          【讨论】:

          • 污染内置原型是一种糟糕的编码习惯。
          • @nurettin 请参阅programmers.stackexchange.com/questions/104320/… 了解更多讨论。我会添加一个(适当范围的)静态辅助函数,签名为repeat(str, n)
          • 我会删除n= n || 1 部分(或检查n 是否未定义),因此您也可以重复0 次。
          • 也可以看看 Mozilla 的 ES6 官方 polyfill:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
          • @ChrisV, String.repeat 仅在 ES6 中添加,直到 2015 年 6 月才最终确定。所以我认为我在 2012 年写的时候我的观点是有效的。:)
          【解决方案6】:

          这是一个 ES6 版本

          const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
          repeat("A",20).forEach((a,b) => console.log(a,b+1))

          【讨论】:

            【解决方案7】:
            Array(10).fill('a').join('')
            

            虽然投票最多的答案更紧凑,但通过这种方法,您不必添加额外的数组项。

            【讨论】:

            • 很遗憾,IE 不支持 fill 方法,如果不兼容 IE 也可以使用 repeat 方法。
            • 如果你单独使用join("a"),为什么还要使用额外的方法fill()...
            • 如果你想要一个分隔符,这个答案很有用
            【解决方案8】:

            最高效的方式是https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

            短版如下。

              String.prototype.repeat = function(count) {
                if (count < 1) return '';
                var result = '', pattern = this.valueOf();
                while (count > 1) {
                  if (count & 1) result += pattern;
                  count >>>= 1, pattern += pattern;
                }
                return result + pattern;
              };
              var a = "a";
              console.debug(a.repeat(10));
            

            来自 Mozilla 的 Polyfill:

            if (!String.prototype.repeat) {
              String.prototype.repeat = function(count) {
                'use strict';
                if (this == null) {
                  throw new TypeError('can\'t convert ' + this + ' to object');
                }
                var str = '' + this;
                count = +count;
                if (count != count) {
                  count = 0;
                }
                if (count < 0) {
                  throw new RangeError('repeat count must be non-negative');
                }
                if (count == Infinity) {
                  throw new RangeError('repeat count must be less than infinity');
                }
                count = Math.floor(count);
                if (str.length == 0 || count == 0) {
                  return '';
                }
                // Ensuring count is a 31-bit integer allows us to heavily optimize the
                // main part. But anyway, most current (August 2014) browsers can't handle
                // strings 1 << 28 chars or longer, so:
                if (str.length * count >= 1 << 28) {
                  throw new RangeError('repeat count must not overflow maximum string size');
                }
                var rpt = '';
                for (;;) {
                  if ((count & 1) == 1) {
                    rpt += str;
                  }
                  count >>>= 1;
                  if (count == 0) {
                    break;
                  }
                  str += str;
                }
                // Could we try:
                // return Array(count + 1).join(this);
                return rpt;
              }
            }
            

            【讨论】:

            • 这个不错,但是新的原生“repeat”更快,不需要实现,谢谢!
            • 你能详细说明count &gt;&gt;&gt;= 1, pattern += pattern;的含义吗?什么样的说法?
            • 那么这是原生重复的polyfill,那么?只需在开头添加 if (!String.prototype.repeat) {,在末尾添加 }
            • >>>= 是无符号右移赋值(如 count = count >>> 1)见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
            【解决方案9】:

            在 CoffeeScript 中:

            ( 'a' for dot in [0..10]).join('')
            

            【讨论】:

              【解决方案10】:

              适用于所有浏览器

              以下函数的执行速度将比已接受答案中建议的选项快得多:

              var repeat = function(str, count) {
                  var array = [];
                  for(var i = 0; i < count;)
                      array[i++] = str;
                  return array.join('');
              }
              

              你会这样使用它:

              var repeatedString = repeat("a", 10);
              

              要将此函数的性能与已接受答案中提出的选项的性能进行比较,请参阅 this Fiddlethis Fiddle 以获取基准。

              仅适用于现代浏览器

              在现代浏览器中,您现在可以使用String.prototype.repeat 方法执行此操作:

              var repeatedString = "a".repeat(10);
              

              MDN 上阅读有关此方法的更多信息。

              这个选项甚至更快。不幸的是,它不适用于任何版本的 Internet Explorer。表中的数字指定了第一个完全支持该方法的浏览器版本:

              【讨论】:

                【解决方案11】:

                也可以用作单线:

                function repeat(str, len) {
                    while (str.length < len) str += str.substr(0, len-str.length);
                    return str;
                }
                

                【讨论】:

                • 在任何比赛中,“for”都比“while”快。 :-)
                【解决方案12】:
                function repeatString(n, string) {
                  var repeat = [];
                  repeat.length = n + 1;
                  return repeat.join(string);
                }
                
                repeatString(3,'x'); // => xxx
                repeatString(10,'?'); // => "??????????"
                

                【讨论】:

                  【解决方案13】:

                  在 ES2015/ES6 中你可以使用"*".repeat(n)

                  因此,只需将其添加到您的项目中,您就可以开始了。

                    String.prototype.repeat = String.prototype.repeat || 
                      function(n) {
                        if (n < 0) throw new RangeError("invalid count value");
                        if (n == 0) return "";
                        return new Array(n + 1).join(this.toString()) 
                      };
                  

                  【讨论】:

                  • SCRIPT5029:尝试使用此方法时,数组长度必须是有限正整数
                  【解决方案14】:
                  var stringRepeat = function(string, val) {
                    var newString = [];
                      for(var i = 0; i < val; i++) {
                        newString.push(string);
                    }
                    return newString.join('');
                  }
                  
                  var repeatedString = stringRepeat("a", 1);
                  

                  【讨论】:

                    【解决方案15】:

                    Lodash 提供与Javascript repeat() 类似的功能,但并非所有浏览器都提供。它被称为_.repeat,从 3.0.0 版本开始可用:

                    _.repeat('a', 10);
                    

                    【讨论】:

                      【解决方案16】:
                      String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''); };
                      
                      // console.log("0".repeat(3) , "0".repeat(-3))
                      // return: "000" "000"
                      

                      【讨论】:

                      • 这会覆盖当前浏览器中原生包含的String.prototype.repeat。另外,为什么要缩小它?您无需将所有内容写在一行中。
                      • IE 中没有“重复”功能,因此需要原型。
                      【解决方案17】:

                      在新的 ES6 和谐中,您将拥有使用 repeat 执行此操作的原生方式。同样 ES6 目前还只是实验性的,这个功能是 already available 在 Edge、FF、Chrome 和 Safari 中

                      "abc".repeat(3) // "abcabcabc"
                      

                      当然,如果重复功能不可用,您可以使用 old-good Array(n + 1).join("abc")

                      【讨论】:

                        【解决方案18】:

                        为了在我的项目中重复一个值,我使用重复

                        例如:

                        var n = 6;
                        for (i = 0; i < n; i++) {
                            console.log("#".repeat(i+1))
                        }
                        

                        但要小心,因为此方法已添加到 ECMAScript 6 规范中。

                        【讨论】:

                          【解决方案19】:

                          这是我使用的:

                          function repeat(str, num) {
                                  var holder = [];
                                  for(var i=0; i<num; i++) {
                                      holder.push(str);
                                  }
                                  return holder.join('');
                              }
                          

                          【讨论】:

                            【解决方案20】:

                            如果你不反对在你的项目中包含一个库,lodash 有一个重复功能。

                            _.repeat('*', 3);
                            // → '***
                            

                            https://lodash.com/docs#repeat

                            【讨论】:

                              【解决方案21】:

                              我将扩展 @bonbon's answer。他的方法是“将 N 个字符附加到现有字符串”的简单方法,以防万一有人需要这样做。比如"a google" is a 1 followed by 100 zeros.

                              for(var google = '1'; google.length < 1 + 100; google += '0'){}
                              document.getElementById('el').innerText = google;
                              <div>This is "a google":</div>
                              <div id="el"></div>

                              注意:您必须将原始字符串的长度添加到条件中。

                              【讨论】:

                                【解决方案22】:

                                另一种选择是:

                                for(var word = ''; word.length < 10; word += 'a'){}
                                

                                如果您需要重复多个字符,请乘以您的条件:

                                for(var word = ''; word.length < 10 * 3; word += 'foo'){}
                                

                                注意:您不必像word = Array(11).join('a')那样超调1

                                【讨论】:

                                  【解决方案23】:

                                  另一个快速重复n个字符的有趣方法是使用快速求幂算法中的思想:

                                  var repeatString = function(string, n) {
                                      var result = '', i;
                                  
                                      for (i = 1; i <= n; i *= 2) {
                                          if ((n & i) === i) {
                                              result += string;
                                          }
                                          string = string + string;
                                      }
                                  
                                      return result;
                                  };
                                  

                                  【讨论】:

                                  • 为什么说“有趣的方式”?这里有什么有趣的?这是显而易见的首选解决方案,是计算机程序最基本的示例。
                                  【解决方案24】:
                                  /**  
                                   * Repeat a string `n`-times (recursive)
                                   * @param {String} s - The string you want to repeat.
                                   * @param {Number} n - The times to repeat the string.
                                   * @param {String} d - A delimiter between each string.
                                   */
                                  
                                  var repeat = function (s, n, d) {
                                      return --n ? s + (d || "") + repeat(s, n, d) : "" + s;
                                  };
                                  
                                  var foo = "foo";
                                  console.log(
                                      "%s\n%s\n%s\n%s",
                                  
                                      repeat(foo),        // "foo"
                                      repeat(foo, 2),     // "foofoo"
                                      repeat(foo, "2"),   // "foofoo"
                                      repeat(foo, 2, "-") // "foo-foo"
                                  );
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 2020-03-14
                                    • 2012-12-06
                                    • 2021-12-25
                                    • 2019-04-16
                                    • 2020-04-01
                                    • 1970-01-01
                                    • 2017-04-28
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多