在Perl中,我可以使用以下语法多次重复一个字符:
$a = "a" x 10; // results in "aaaaaaaaaa"
在Javascript中有一种简单的方法可以实现这一点吗?我显然可以使用一个函数,但我想知道是否有任何内置方法或其他一些聪明的技术。
答案 0 :(得分:1089)
现在,repeat
string method几乎实现了<{3}}。 (它是not in Internet Explorer。)因此,除非您需要支持旧浏览器,否则您只需编写:
"a".repeat(10)
在repeat
之前,我们使用了这个黑客:
Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"
(注意,长度为11的数组只能获得10“a”,因为Array.join
将参数放在数组元素之间。)
Simon还指出,根据this jsperf,似乎在Safari和Chrome(但不是Firefox)中通过简单地使用for循环附加多次重复一个字符会更快(尽管简洁一点)
答案 1 :(得分:293)
在新的ES6和声中,您将使用repeat以原生的方式执行此操作。另外ES6现在只是实验性的,此功能在Edge,FF,Chrome和Safari中都是already available
"abc".repeat(3) // "abcabcabc"
当然,如果没有重复功能,你可以使用旧的Array(n + 1).join("abc")
答案 2 :(得分:50)
如果你经常重复一遍很方便:
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) )
答案 3 :(得分:13)
最佳表现方式是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;
}
}
答案 4 :(得分:12)
另一种选择是:
for(var word = ''; word.length < 10; word += 'a'){}
如果您需要重复多个字符,请将条件乘以:
for(var word = ''; word.length < 10 * 3; word += 'foo'){}
注意:与word = Array(11).join('a')
一样,您不必超过1
答案 5 :(得分:10)
答案 6 :(得分:9)
以下功能的执行速度比接受的答案中建议的选项快得多:
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 Fiddle和this Fiddle了解基准。
在现代浏览器中,您现在可以使用String.prototype.repeat
方法执行此操作:
var repeatedString = "a".repeat(10);
在MDN上了解有关此方法的更多信息。
此选项更快。不幸的是,它在任何版本的Internet Explorer中都不起作用。表中的数字指定了完全支持该方法的第一个浏览器版本:
答案 7 :(得分:8)
Array(10).fill('a').join('')
虽然投票最多的答案更紧凑,但通过这种方法,您不必添加额外的数组项。
答案 8 :(得分: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())
};
答案 9 :(得分: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"
);
答案 10 :(得分: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;
};
答案 11 :(得分:2)
为了在我的项目中重复一个值,我使用repeat
例如:
var n = 6;
for (i = 0; i < n; i++) {
console.log("#".repeat(i+1))
}
但要小心,因为此方法已添加到ECMAScript 6规范中。
答案 12 :(得分:1)
以下是我使用的内容:
function repeat(str, num) {
var holder = [];
for(var i=0; i<num; i++) {
holder.push(str);
}
return holder.join('');
}
答案 13 :(得分:1)
function repeatString(n, string) {
var repeat = [];
repeat.length = n + 1;
return repeat.join(string);
}
repeatString(3,'x'); // => xxx
repeatString(10,''); // => ""
答案 14 :(得分:1)
带有零的右垫,没有数组或循环。只需在ES6 2015中使用repeat()
,现在已有wide support。如果您切换串联,请左垫。
function pad(text, maxLength){
var res = text + "0".repeat(maxLength - text.length);
return res;
}
console.log(pad('hello', 8)); //hello000
答案 15 :(得分:0)
我要扩展@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;
&#13;
<div>This is "a google":</div>
<div id="el"></div>
&#13;
注意:您必须将原始字符串的长度添加到条件中。
答案 16 :(得分:0)
Lodash提供与Javascript repeat()功能类似的功能,并非所有浏览器都可用。它被称为_.repeat,自版本3.0.0起可用:
_.repeat('a', 10);
答案 17 :(得分: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);
答案 18 :(得分:0)
也可以作为单行使用:
function repeat(str, len) {
while (str.length < len) str += str.substr(0, len-str.length);
return str;
}
答案 19 :(得分:0)
在CoffeeScript中:
( 'a' for dot in [0..10]).join('')
答案 20 :(得分:0)
这是您可以通过Array()和join()的帮助调用函数并获得结果的方式
package.json
答案 21 :(得分:0)
为了好玩,这里是另一种使用 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));
答案 22 :(得分:-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"
答案 23 :(得分:-3)
这是ES6版本
const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))