因此,我的问题已经有人以Java形式在此处提出:Java-创建一个具有指定长度并填充特定字符的新String实例。最佳解决方案?
。。。但我正在寻找其JavaScript等效项。
基本上,我想根据每个字段的“ maxlength”属性以“#”字符动态填充文本字段。因此,如果输入具有has maxlength="3"
,则该字段将用“ ###”填充。
理想情况下,会有类似Java的东西StringUtils.repeat("#", 10);
,但是到目前为止,我能想到的最好的选择是一次遍历并附加“#”字符,直到达到最大长度为止。我不能动摇的感觉是,有比这更有效的方法了。
有任何想法吗?
仅供参考-我不能简单地在输入中设置默认值,因为“#”字符需要清晰显示,并且,如果用户未输入值,则需要在模糊时重新填充。这是我关注的“补充”步骤
最好的方法(我已经看到)是
var str = new Array(len + 1).join( character );
这将创建具有给定长度的数组,然后将其与给定的字符串连接以重复。.join()
不管元素是否分配了值,该函数都会遵守数组的长度,并且未定义的值将呈现为空字符串。
您必须在所需的长度上加1,因为分隔符字符串位于数组元素之间。
尝试一下:P
s = '#'.repeat(10)
document.body.innerHTML = s
不幸的是,尽管这里提到的Array.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);
};
这很冗长,因此,如果要简洁的实现,可以采用幼稚的方法。它仍然比Array.join方法的性能好2到10倍,并且比小输入的两倍实现快。码:
// 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;
}
更多信息:
ES2015 the easiest way is to do something like
'X'.repeat(data.length)
X
being any string, data.length
being the desired length.
see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
I would create a constant string and then call substring on it.
Something like
var hashStore = '########################################';
var Fiveup = hashStore.substring(0,5);
var Tenup = hashStore.substring(0,10);
A bit faster too.
http://jsperf.com/const-vs-join
ES6的一个不错的选择是将padStart
字符串设为空。像这样:
var str = ''.padStart(10, "#");
注意:这在IE(不带polyfill)中不起作用。
适用于所有浏览器的版本
此功能可以满足您的要求,并且比接受的答案中建议的选项执行速度快得多:
var repeat = function(str, count) {
var array = [];
for(var i = 0; i <= count;)
array[i++] = str;
return array.join('');
}
您可以这样使用它:
var repeatedCharacter = repeat("a", 10);
要将此功能的性能与已接受答案中建议的选项的性能进行比较,请参阅此Fiddle和此Fiddle以获得基准。
仅适用于现代浏览器的版本
在现代浏览器中,您现在还可以执行以下操作:
var repeatedCharacter = "a".repeat(10) };
此选项甚至更快。但是,不幸的是,它不适用于任何版本的Internet Explorer。
表格中的数字指定了完全支持该方法的第一个浏览器版本:
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;
}
}
基于来自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)
}
}
如果愿意,可以将函数的第一行用作单行代码:
function repeat(str, len) {
while (str.length < len) str += str.substr(0, len-str.length);
return str;
}
文章标签:html , javascript , string
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!