Repeat Character N Times
在Perl中,我可以使用以下语法多次重复一个字符:
1 | $a ="a" x 10; // results in"aaaaaaaaaa" |
有没有一种简单的方法来实现这个Javascript? 我显然可以使用一个函数,但我想知道是否有任何内置方法,或其他一些聪明的技术。
目前,
1 | "a".repeat(10) |
在
1 | Array(11).join("a") // create string with 10 a's:"aaaaaaaaaa" |
(注意,长度为11的数组只能获得10"a",因为
西蒙还指出,根据这个jsperf,似乎在Safari和Chrome(但不是Firefox)中通过简单地使用for循环附加多次重复一个字符会更快(虽然不那么简洁)。
在一个新的ES6和声中,你可以通过重复做到这一点。此外ES6现在只是实验性的,此功能已在Edge,FF,Chrome和Safari中提供
1 | "abc".repeat(3) //"abcabcabc" |
当然,如果没有重复功能,你可以使用旧的
如果你重复自己很方便:
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'){} |
注意:与
如果您不反对在项目中包含库,则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); |
要比较此函数的性能与接受答案中提出的选项的性能,请参阅此小提琴和此小提琴的基准。
仅适用于现代浏览器
在现代浏览器中,您现在可以使用
1 | var repeatedString ="a".repeat(10); |
在MDN上阅读有关此方法的更多信息。
此选项更快。不幸的是,它在任何版本的Internet Explorer中都不起作用。表中的数字指定了完全支持该方法的第一个浏览器版本:
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中,您可以使用
所以只需将它添加到您的项目中,您就可以了。
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)) |