200

したがって、私の質問は、ここのJavaフォームで他の誰かから尋ねられました。Java-指定された長さで特定の文字で満たされた新しいStringインスタンスを作成します。最善の解決策は?

。。。しかし、私はそれに相当するJavaScriptを探しています。

基本的に、各フィールドの「maxlength」属性に基づいて、テキストフィールドに「#」文字を動的に入力したいと考えています。したがって、入力にが含まれている場合maxlength="3"、フィールドは「###」で埋められます。

理想的にはJavaのようなものがありますStringUtils.repeat("#", 10);が、これまでのところ、私が考えることができる最善のオプションは、最大長に達するまで、一度に1つずつループして「#」文字を追加することです。それよりも効率的な方法があるという気持ちを揺るがすことはできません。

何か案は?

参考までに-「#」文字はフォーカスでクリアする必要があり、ユーザーが値を入力しなかった場合は、ぼかしで「補充」する必要があるため、入力にデフォルト値を単純に設定することはできません。それは私が関わっている「補充」ステップです

4

12 に答える 12

352

これを行うための最良の方法(私が見たもの)は

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

これにより、指定された長さの配列が作成され、指定された文字列と結合されて繰り返されます。この.join()関数は、要素に値が割り当てられているかどうかに関係なく配列の長さを尊重し、未定義の値は空の文字列としてレンダリングされます。

区切り文字列は配列要素の間にあるため、目的の長さに1を追加する必要があります。

于 2013-01-15T17:59:54.493 に答える
229

これを試してみてください:P

s = '#'.repeat(10)

document.body.innerHTML = s

于 2016-01-15T12:44:37.267 に答える
37

ES2015の最も簡単な方法は、次のようなことを行うことです。

'X'.repeat(data.length)

X任意の文字列でdata.lengthあり、目的の長さです。

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

于 2018-10-05T17:13:57.520 に答える
31

残念ながら、ここで説明した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倍優れたパフォーマンスを発揮し、小さな入力の2倍の実装よりも高速です。コード:

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

さらに詳しい情報:

于 2014-01-27T01:33:33.420 に答える
24

定数文字列を作成してから、その上でサブ文字列を呼び出します。

何かのようなもの

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

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

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

少し速くなります。

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

于 2013-03-09T05:23:26.690 に答える
11

ES6の優れたオプションはpadStart、空の文字列です。このような:

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

注:これはIEでは機能しません(ポリフィルなし)。

于 2018-06-07T15:48:17.743 に答える
4

すべてのブラウザで動作するバージョン

この関数はあなたが望むことをし、受け入れられた答えで提案されたオプションよりもはるかに速く実行します:

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

このオプションはさらに高速です。ただし、残念ながら、どのバージョンのInternetExplorerでも機能しません。

表の数字は、メソッドを完全にサポートする最初のブラウザバージョンを示しています。

ここに画像の説明を入力してください

于 2016-02-25T18:42:52.280 に答える
3
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;
      }
    } 
于 2016-11-02T22:06:47.733 に答える
3

ホーガンとゼロトリックポニーからの回答に基づいています。これは、ほとんどのユースケースを適切に処理するのに十分な速度と柔軟性の両方を備えている必要があると思います。

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)  
    }  
}  
于 2017-04-25T15:06:28.110 に答える
1

必要に応じて、関数の最初の行をワンライナーとして使用できます。

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}
于 2017-05-14T16:24:56.787 に答える
0

私はします

Buffer.alloc(length, character).toString()
于 2021-04-15T13:56:49.500 に答える
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);
}
于 2021-07-27T09:35:27.163 に答える