所以,我的问题已经被其他人以Java形式在这里问了:Java -创建一个新的字符串实例,具有指定的长度和填充特定的字符。最好的解决方案?
……但我正在寻找它的JavaScript等效。
基本上,我想动态填充文本字段与“#”字符,基于每个字段的“maxlength”属性。因此,如果一个输入有maxlength="3",那么该字段将被"###"填充。
理想情况下,应该有类似Java StringUtils的东西。repeat("#", 10);,但是,到目前为止,我能想到的最好的选择是循环遍历和追加"#"字符,一次一个,直到达到最大长度。我总觉得还有比这更有效的方法。
什么好主意吗?
供您参考-我不能简单地在输入中设置默认值,因为“#”字符需要在焦点上清除,并且,如果用户没有输入值,将需要在模糊上“重新填充”。我所关心的是“补充”步骤
不幸的是,尽管数组。这里提到的join方法很简洁,它比基于字符串连接的实现慢了大约10倍。它在大弦上的表现尤其糟糕。有关完整的性能细节,请参见下面。
在Firefox、Chrome、Node.js MacOS、Node.js Ubuntu和Safari上,我测试的最快实现是:
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);
};
这是冗长的,所以如果你想要一个简洁的实现,你可以使用朴素的方法;它的性能仍然比阵列好2倍到10倍。Join方法,并且对于小输入也比加倍实现更快。代码:
// 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;
}
进一步的信息:
在您自己的浏览器中运行速度测试
速度测试的完整源代码
速度测试结果
适用于所有浏览器的版本
这个函数做你想要的,并且执行得比在接受的答案中建议的选项快得多:
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) };
这个选项甚至更快。然而,不幸的是,它不能在任何版本的ie浏览器中运行。
表中的数字指定了完全支持该方法的第一个浏览器版本: