Create a string of variable length, filled with a repeated character

前端 未结 10 1093
刺人心
刺人心 2020-11-28 03:59

So, my question has been asked by someone else in it\'s Java form here: Java - Create a new String instance with specified length and filled with specific character. Best so

相关标签:
10条回答
  • 2020-11-28 04:26

    The best way to do this (that I've seen) is

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

    That creates an array with the given length, and then joins it with the given string to repeat. The .join() function honors the array length regardless of whether the elements have values assigned, and undefined values are rendered as empty strings.

    You have to add 1 to the desired length because the separator string goes between the array elements.

    0 讨论(0)
  • 2020-11-28 04:28

    A great ES6 option would be to padStart an empty string. Like this:

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

    Note: this won't work in IE (without a polyfill).

    0 讨论(0)
  • 2020-11-28 04:31

    Version that works in all browsers

    This function does what you want, and performs a lot faster than the option suggested in the accepted answer :

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

    You use it like this :

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

    To compare the performance of this function with that of the option proposed in the accepted answer, see this Fiddle and this Fiddle for benchmarks.

    Version for moderns browsers only

    In modern browsers, you can now also do this :

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

    This option is even faster. However, unfortunately it doesn't work in any version of Internet explorer.

    The numbers in the table specify the first browser version that fully supports the method :

    0 讨论(0)
  • 2020-11-28 04:34

    You can use the first line of the function as a one-liner if you like:

    function repeat(str, len) {
        while (str.length < len) str += str.substr(0, len-str.length);
        return str;
    }
    
    0 讨论(0)
  • 2020-11-28 04:36
    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);   
    

    You can also add a polyfill for Repeat for older browsers

        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;
          }
        } 
    
    0 讨论(0)
  • 2020-11-28 04:37

    Unfortunately although the Array.join approach mentioned here is terse, it is about 10X slower than a string-concatenation-based implementation. It performs especially badly on large strings. See below for full performance details.

    On Firefox, Chrome, Node.js MacOS, Node.js Ubuntu, and Safari, the fastest implementation I tested was:

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

    This is verbose, so if you want a terse implementation you could go with the naive approach; it still performs betweeb 2X to 10X better than the Array.join approach, and is also faster than the doubling implementation for small inputs. Code:

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

    Further information:

    • Run speed test in your own browser
    • Full source code of speed test
    • Speed test results
    0 讨论(0)
提交回复
热议问题