在JavaScript中重复一个字符串多次

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

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

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

360574 次浏览

如今,#0字符串方法在任何地方都实现了几乎。(它是不在Internet Explorer中。)所以除非你需要支持旧的浏览器,你可以简单地写:

"a".repeat(10)

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

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

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

西蒙还指出,根据这个基准,在Safari和Chrome(但不是Firefox)中,通过简单地使用for循环附加一个字符来重复多次似乎更快(尽管有点不简洁)。

方便,如果你重复自己很多:

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

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

在新的ES6和谐中,您将以重复的方式执行此操作。ES6现在还只是实验性的,此功能在Edge,FF,Chrome和Safari中排名第一

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

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

另一种选择是:

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

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

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

注:你不必像word = Array(11).join('a')那样超过1

最有效的方法是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的Polyill:

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

另一个有趣的方法迅速重复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;};

我将扩展@bonbon的回答。他的方法是一种“将N个字符附加到现有字符串”的简单方法,以防有人需要这样做。例如,从“谷歌”是一个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>

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

如果你不反对在你的项目中包含一个库,那么Lodash有一个重复函数。

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

https://lodash.com/docs#repeat

以下是我使用的:

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

对于所有浏览器

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

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。表中的数字指定了完全支持该方法的第一个浏览器版本:

在此处输入图片描述

对于在我的项目中重复一个值,我使用重复

例如:

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

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

在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())};
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"

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

_.repeat('a', 10);
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);
function repeatString(n, string) {var repeat = [];repeat.length = n + 1;return repeat.join(string);}
repeatString(3,'x'); // => xxxrepeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"

也可以用作单行:

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

在CoffeeScript中:

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

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

这是一个ES6版本

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

这就是你如何调用一个函数并通过Array()和连接()的帮助获得结果

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

截至目前,96.39%的浏览器支持String.repeat()

function pad(text, maxLength){return text + "0".repeat(maxLength - text.length);}console.log(pad('text', 7)); //text000

只是为了好玩,这是另一种使用to修复的方法,用于格式化浮点数。

通过做

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

我们得到

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

我知道这不是一个受欢迎的任务,如果你需要重复你的字符串不是整数的次数怎么办?

这是可能的repeat()slice(),这里是如何:

String.prototype.fracRepeat = function(n){if(n < 0) n = 0;var n_int = ~~n; // amount of whole times to repeatvar n_frac = n - n_int; // amount of fraction times (e.g., 0.5)var frac_length = ~~(n_frac * this.length); // length in characters of fraction part, floored  
return this.repeat(n) + this.slice(0, frac_length);}

下面是一个简短的版本:

String.prototype.fracRepeat = function(n){if(n < 0) n = 0;return this.repeat(n) + this.slice(0, ~~((n - ~~n) * this.length));}
var s = "abcd";console.log(s.fracRepeat(2.5))