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

时间:2013-01-15 17:57:43

标签: javascript html string

所以,我的问题已经被其他人用它的Java表格问了:Java - Create a new String instance with specified length and filled with specific character. Best solution?

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

基本上,我想根据每个字段的“maxlength”属性动态填充带有“#”字符的文本字段。因此,如果输入具有maxlength="3",则该字段将填充“###”。

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

有什么想法吗?

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

12 个答案:

答案 0 :(得分:274)

这样做的最佳方式(我见过)是

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

创建一个具有给定长度的数组,然后将其与给定的字符串连接以重复。 .join()函数表示数组长度,无论元素是否分配了值,未定义的值都呈现为空字符串。

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

答案 1 :(得分:118)

尝试一下:P

s = '#'.repeat(10)

document.body.innerHTML = s

答案 2 :(得分:29)

不幸的是,虽然这里提到的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;
}

更多信息:

答案 3 :(得分:20)

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

这样的东西
var hashStore = '########################################';

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

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

也快一点。

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

答案 4 :(得分:9)

ES2015最简单的方法是执行

'X'.repeat(data.length)

X是任何字符串,data.length是所需的长度。

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

答案 5 :(得分:3)

适用于所有浏览器的版本

此功能可以满足您的需求,并且比接受的答案中建议的选项执行速度快得多:

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

你这样使用它:

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

要将此功能的效果与接受的答案中建议的选项进行比较,请参阅this Fiddlethis Fiddle了解基准。

仅适用于现代浏览器的版本

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

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

此选项更快。但是,遗憾的是,它无法在任何版本的Internet Explorer中使用。

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

enter image description here

答案 6 :(得分:3)

scipy.io

You can also add a polyfill for Repeat for older browsers

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

答案 7 :(得分:2)

基于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)  
    }  
}  

答案 8 :(得分:1)

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

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

注意:这在IE中不起作用(没有填充)。

答案 9 :(得分:0)

如果您愿意,可以将函数的第一行用作单行:

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

答案 10 :(得分:0)

我愿意

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

答案 11 :(得分:0)

如果它是您需要的性能(在 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);
}