关于javascript:重复字符N次

Repeat Character N Times

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

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

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


目前,repeat字符串方法几乎无处不在。 (它不在Internet Explorer中。)因此,除非您需要支持旧版浏览器,否则您只需编写:

1
"a".repeat(10)

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

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

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

西蒙还指出,根据这个jsperf,似乎在Safari和Chrome(但不是Firefox)中通过简单地使用for循环附加多次重复一个字符会更快(虽然不那么简洁)。


在一个新的ES6和声中,你可以通过重复做到这一点。此外ES6现在只是实验性的,此功能已在Edge,FF,Chrome和Safari中提供

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

当然,如果没有重复功能,你可以使用旧的Array(n + 1).join("abc")


如果你重复自己很方便:

1
2
3
4
5
6
7
8
String.prototype.repeat = String.prototype.repeat || function(n){
  n= n || 1;
  return Array(n+1).join(this);
}

alert(  'Are we there yet?
No.
'
.repeat(10)  )


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

简短版本如下。

1
2
3
4
5
6
7
8
9
10
11
  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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;
  }
}


另一种选择是:

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

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

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

注意:与word = Array(11).join('a')一样,您不必超过1


如果您不反对在项目中包含库,则lodash具有重复功能。

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

https://lodash.com/docs#repeat


适用于所有浏览器

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

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

你会这样使用它:

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

要比较此函数的性能与接受答案中提出的选项的性能,请参阅此小提琴和此小提琴的基准。

仅适用于现代浏览器

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

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

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

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

enter image description here


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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**  
 * 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
%s
%s
%s"
,

    repeat(foo),        //"foo"
    repeat(foo, 2),     //"foofoo"
    repeat(foo,"2"),   //"foofoo"
    repeat(foo, 2,"-") //"foo-foo"
);


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

所以只需将它添加到您的项目中,您就可以了。

1
2
3
4
5
6
  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())
    };


另一种快速重复n个字符的有趣方法是使用快速取幂算法的思路:

1
2
3
4
5
6
7
8
9
10
11
12
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;
};


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

例如:

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

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


1
2
3
4
5
6
7
8
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

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

这是我使用的:

1
2
3
4
5
6
7
function repeat(str, num) {
        var holder = [];
        for(var i=0; i<num; i++) {
            holder.push(str);
        }
        return holder.join('');
    }


我将扩展@bonbon的答案。他的方法是一种"将N个字符附加到现有字符串"的简单方法,以防万一有人需要这样做。例如,因为"谷歌"是1后跟100个零。

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

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


Lodash提供了与Javascript repeat()函数类似的功能,并非所有浏览器都可用。它被称为_.repeat,自版本3.0.0起可用:

1
_.repeat('a', 10);

1
2
3
4
5
6
7
8
9
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);

也可以用作单线:

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


在CoffeeScript中:

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


1
2
3
4
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"


这是ES6版本

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