重复字符N次


602

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

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

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

Answers:


1201

如今,repeat字符串方法几乎在所有地方都已实现。(它不在Internet Explorer中。)因此,除非需要支持较旧的浏览器,否则只需编写以下内容:

"a".repeat(10)

在之前repeat,我们使用了此技巧:

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

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

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


4
另外,你可以使用一个变量,而不是一个固定长度-阵列(20-LEN),说垫字符串最多为20个
约翰·C·

7
循环方法可能更快,但更冗长。另外,我对第一条评论的所有支持都感到困惑,因为考虑到通常在数组长度可变的情况下这很有用,例如Array(rawValue.length + 1).join("*")
Dexygen

这在0和1的情况下不起作用,因为它们产生相同的结果。
瑞安

2
公式是Array(n+1).join("a")。当n = 0时,它返回空字符串,而当n = 1时,它返回"a"。因此,我认为它在所有情况下均有效。
Jason Orendorff

1
@Neel那是因为JS引擎对字符串长度施加了限制。在Chrome和Firefox中,限制接近2 ^ 30(约10亿)。10 ^ 12是一万亿。
詹森·奥伦多夫

301

在新的ES6和声中,您将具有重复执行此操作的本地方法。ES6现在也仅是实验性的,此功能在Edge,FF,Chrome和Safari中提供

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

并且可以肯定的是,如果没有重复功能,则可以使用旧的 Array(n + 1).join("abc")


54

如果重复很多,这很方便:

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)  )


53
污染内置插件的原型是不好的编码做法。
tuomassalo 2012年

3
@nurettin看到programmers.stackexchange.com/questions/104320/...更多的讨论。我将添加一个(适当范围内的)静态辅助函数,其签名为repeat(str, n)
tuomassalo

4
我将删除该n= n || 1零件(或检查是否n未定义),以便您也可以重复0次数。
chodorowicz

3
也看看Mozilla的对ES6官方填充工具:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
的Eirik伯克兰

3
@ChrisV String.repeat仅在ES6中添加,直到2015年6月才最终确定。因此,我认为我的观点在2012
tuomassalo

13

性能最佳的方法是https://developer.mozilla.org/zh-CN/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;
  }
}

这是一个很好的选择,但是新的本机“重复”速度更快,并且不需要任何实现,谢谢!
Goty Metal

1
您能详细说明一下count >>>= 1, pattern += pattern;吗?这是什么样的说法?
Tsahi Asher

那么,这是本机重复的polyfill吗?只需if (!String.prototype.repeat) {在开头和}结尾处添加一个即可。
2015年

>>> =是无符号的右移位的分配(如在计数=计数>>> 1)见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
user1441004

12

一种替代方法是:

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

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

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

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



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);

要将此功能的性能与接受的答案中建议的选项的性能进行比较,请参阅此小提琴此小提琴以获得基准。

仅适用于现代浏览器

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

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

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

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

在此处输入图片说明


9
Array(10).fill('a').join('')

尽管投票最多的答案更为紧凑,但是使用这种方法,您不必添加额外的数组项。


1
不幸的是,IE中不支持fill方法,如果您不兼容IE,您也可以使用重复方法。
米歇尔

1
fill()如果join("a")单独使用相同的方法,为什么还要使用额外的方法呢?
vsync

7
/**  
 * 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"
);

7

在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:尝试使用此方法时,数组长度必须为有限的正整数
andrepaulo

5

快速重复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;
};

你为什么说“有趣的方式”?这里有什么有趣的?这是显而易见的首选解决方案,它是计算机程序的最基本的基本示例。
vsync

2

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

例如:

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

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


2
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

repeatString(3,'x'); // => xxx
repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"


0

我将扩展@bonbon的答案。他的方法是一种“将N个字符附加到现有字符串上”的简单方法,以防万一有人需要这样做。例如,由于“ a google”是1后跟100个零

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>

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



0
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);

0

也可以用作单线:

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

在任何比赛中,“ for”比“ while”更快。:-)
junihh


0

这是您可以如何调用函数并借助Array()和join()获得结果的方法

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

console.log(repeatStringNumTimes("a",10))


-1
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"

1
这将覆盖String.prototype.repeat当前浏览器中固有的内容。另外,为什么要缩小呢?您无需全部写成一行。
Blender

IE中没有“重复”功能,因此需要原型。
Caglayan ALTINCI '16

-3

这是ES6版本

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.