创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);
也快一点。
适用于所有浏览器的版本
这个函数做你想要的,并且比接受的答案中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; }