创建一个可变长度的字符串,用重复字符填充

所以,我的问题已经被其他人以Java形式问过了:创建一个新的字符串实例,具有指定的长度和填充特定的字符。最好的解决方案?

……但我正在寻找它的JavaScript等效。

基本上,我想动态填充文本字段与“#”字符,基于每个字段的“maxlength”属性。因此,如果一个输入有maxlength="3",那么该字段将被“###”填充。

理想情况下,会有类似Java StringUtils.repeat("#", 10);的东西,但是,到目前为止,我能想到的最好的选择是循环并追加“#”字符,一次一个,直到达到最大长度。我总觉得还有比这更有效的方法。

什么好主意吗?

供您参考-我不能简单地在输入中设置默认值,因为“#”字符需要在焦点上清除,并且,如果用户没有输入值,将需要在模糊上“重新填充”。我所关心的是“补充”步骤

160181 次浏览

(我所见过的)最好的方法是

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

这将创建一个具有给定长度的数组,然后将其与给定的字符串连接以重复操作。.join()函数遵循数组长度,而不管元素是否赋值,未定义的值将呈现为空字符串。

你必须给你想要的长度加上1,因为分隔符字符串是之间的数组元素。

我会创建一个常量字符串,然后在它上面调用substring。

类似的

var hashStore = '########################################';


var Fiveup = hashStore.substring(0,5);


var Tenup = hashStore.substring(0,10);

也快了一点。

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

不幸的是,尽管数组。这里提到的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;
}

进一步的信息:

试一试:P

.
s = '#'.repeat(10)


document.body.innerHTML = s

适用于所有浏览器的版本

这个函数做你想要的,并且执行得比在接受的答案中建议的选项快得多:

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浏览器中运行。

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

enter image description here

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

根据霍根和零戏法小马的回答。我认为这应该足够快速和灵活,以处理大多数用例:

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

一个很好的ES6选项是padStart为空字符串。是这样的:

var str = ''.padStart(10, "#");

注意:这将不会在IE中工作(没有polyfill)。

ES2015最简单的方法是这样做

'X'.repeat(data.length)

X为任意字符串,data.length为所需长度。

看:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

我会这么做

Buffer.alloc(length, character).toString()

如果你需要的是性能(在ES6之前),那么substr和模板字符串的组合可能是最好的。这个函数是我用来创建空格填充字符串的,但是你可以将模板更改为任何你需要的:

function strRepeat(intLen, strTemplate) {
strTemplate = strTemplate || "          ";
var strTxt = '';
while(intLen > strTemplate.length) {
strTxt += strTemplate;
intLen -= strTemplate.length;
}
return ((intLen > 0) ? strTxt + strTemplate.substr(0, intLen) : strTxt);
}