创build一个可变长度的string,填充重复的字符

所以,我的问题已经被Java中的其他人问到了: Java – 创build一个具有指定长度的新string实例,并填充特定字符。 最佳解决scheme

。 。 。 但我正在寻找它的JavaScript等价物。

基本上,我想要根据每个字段的“maxlength”属性dynamic地填充带“#”字符的文本字段。 所以,如果一个input已经有了maxlength="3" ,那么这个字段就会被填充“###”。

理想情况下,会有像Java StringUtils.repeat("#", 10); ,但到目前为止,我能想到的最好的select是循环并追加“#”字符,一次一个,直到达到最大长度。 我不能动摇有这样一种更有效的方式去做的感觉。

有任何想法吗?

仅供参考 – 我不能简单地在input中设置默认值,因为“#”字符需要清除焦点,如果用户没有input值,则需要在模糊处“重新填充”。 这是我所关心的“重新填充”步骤

做到这一点的最好方法(我见过)是

 var str = new Array(len + 1).join( character ); 

这将创build一个具有给定长度的数组,然后将其与给定的string连接以重复。 .join()函数尊重数组的长度,不pipe元素是否赋值,未定义的值都是空string。

您必须将1添加到所需的长度,因为分隔符string数组元素之间

试试这个:P

 s = '#'.repeat(10) document.body.innerHTML = s 

不幸的是,虽然这里提到的Array.join方法是简洁的,但是比基于string连接的实现要慢10倍左右。 它在大string上performance特别糟糕。 请参阅下面的完整性能细节。

在Firefox,Chrome,Node.js,MacOS,Node.js Ubuntu和Safari上,我testing的最快的实现是:

 function repeatChar(count, ch) { if (count == 0) { return ""; } var count2 = count / 2; var result = ch; // double the input until it is long enough. while (result.length <= count2) { result += result; } // use substring to hit the precise length target without // using extra memory return result + result.substring(0, count - result.length); }; 

这是冗长的,所以如果你想要一个简洁的实现,你可以使用天真的方法; 与Array.join方法相比,它的性能仍然要高出2倍到10倍,而且比小型input的倍增实现要快。 码:

 // naive approach: simply add the letters one by one function repeatChar(count, ch) { var txt = ""; for (var i = 0; i < count; i++) { txt += ch; } return txt; } 

更多信息:

  • 在您自己的浏览器中运行速度testing
  • 速度testing的完整源代码
  • 速度testing结果

我会创build一个常量string,然后调用它的子string。

就像是

 var hashStore = '########################################'; var Fiveup = hashStore.substring(0,5); var Tenup = hashStore.substring(0,10); 

也快一点。

http://jsperf.com/const-vs-join

适用于所有浏览器的版本

这个函数做你想要的,并且比接受的答案中build议的选项快得多。

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

你这样使用它:

 var repeatedCharacter = repeat("a", 10); 

为了比较这个函数的性能和接受的答案中提出的选项的性能,看这个小提琴这个小提琴的基准。

版本只适用于现代浏览器

在现代浏览器中,您现在也可以这样做:

 var repeatedCharacter = "a".repeat(10) }; 

这个选项更快。 然而,不幸的是,它不能在任何版本的Internet Explorer中工作。

表中的数字指定完全支持该方法的第一个浏览器版本:

在这里输入图像描述

根据Hogan和Zero Trick Pony的回答。 我认为这应该既快又灵活,以处理好大多数的使用情况:

 var hash = '####################################################################' function build_string(length) { if (length == 0) { return '' } else if (hash.length <= length) { return hash.substring(0, length) } else { var result = hash const half_length = length / 2 while (result.length <= half_length) { result += result } return result + result.substring(0, length - result.length) } } 

好吧,我想这就是你要找的。 你可以看到它是如何在node.js src中实现的:

 function repeatString(str, len) { return Array.apply(null, { length: len + 1 }).join(str).slice(0, len) } 
 For Evergreen browsers, this will build a staircase based on an incoming character and the number of stairs to build. function StairCase(character, input) { let i = 0; while (i < input) { const spaces = " ".repeat(input - (i+1)); const hashes = character.repeat(i + 1); console.log(spaces + hashes); i++; } } //Implement //Refresh the console console.clear(); StairCase("#",6); 

您也可以为旧版浏览器添加重复填充

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

如果你喜欢,你可以使用函数的第一行作为一行代码:

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