문자 N 번 반복


602

Perl에서는 다음 구문을 사용하여 문자를 여러 번 반복 할 수 있습니다.

$a = "a" x 10; // results in "aaaaaaaaaa"

Javascript에서 이것을 달성하는 간단한 방법이 있습니까? 분명히 함수를 사용할 수는 있지만 내장 접근법이나 다른 영리한 기술이 있는지 궁금합니다.

답변:


1201

요즘 repeat문자열 방법거의 모든 곳에서 구현 됩니다. ( Internet Explorer 에는 없습니다 .) 따라서 이전 브라우저를 지원해야하는 경우가 아니면 간단히 다음과 같이 작성할 수 있습니다.

"a".repeat(10)

전에는 repeat이 핵을 사용했습니다 :

Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"

(길이 11 의 배열은 배열 요소 사이Array.join인수 두기 때문에 10 "a"만 가져 옵니다.

Simon은 또한 이 jsperf 에 따르면 Safari와 Chrome (Firefox는 아님)에서 for 루프를 사용하여 문자를 여러 번 반복하는 것이 더 빠르다는 것을 나타냅니다 (약간 간결하지만).


4
또한 고정 길이 대신 변수를 사용할 수 있습니다. Array (20-len), 문자열을 최대 20 개까지
John C

7
루프 방법은 더 빠를 수 있지만 더 장황합니다. 또한 배열 길이가 가변적 일 때 이것이 일반적으로 유용 할 때를 고려하여 첫 의견에 대한 모든 Array(rawValue.length + 1).join("*")
공감대에 당황합니다.

동일한 결과를 생성하므로 0과 1의 경우에는 작동하지 않습니다.
Ryan

2
공식은 Array(n+1).join("a")입니다. n = 0이면 빈 문자열을 반환하고 n = 1이면을 반환합니다 "a". 그래서 나는 그것이 모든 경우에 효과가 있다고 생각합니다.
Jason Orendorff 2016

1
@Neel JS 엔진이 문자열 길이를 제한하기 때문입니다. Chrome 및 Firefox에서 한도는 2 ^ 30 (약 10 억)에 가깝습니다. 10 ^ 12는 1 조입니다.
Jason Orendorff 2009 년

301

새로운 ES6 하모니에서는 반복 하여 기본 작업을 수행 할 수 있습니다 . 또한 ES6은 현재 실험용이므로 Edge, FF, Chrome 및 Safari에서 이미 사용할 수 있습니다 .

"abc".repeat(3) // "abcabcabc"

그리고 반복 기능을 사용할 수 없다면 구식을 사용할 수 있습니다. Array(n + 1).join("abc")


54

자신을 많이 반복하면 편리합니다.

String.prototype.repeat = String.prototype.repeat || function(n){
  n= n || 1;
  return Array(n+1).join(this);
}

alert(  'Are we there yet?\nNo.\n'.repeat(10)  )


53
내장 프로토 타입을 오염시키는 것은 나쁜 코딩 관행입니다.
tuomassalo

3
@nurettin에 대한 자세한 내용 은 programmers.stackexchange.com/questions/104320/… 을 참조하십시오 . 서명이있는 (적절한 범위의) 정적 도우미 함수를 추가했습니다 repeat(str, n).
tuomassalo

4
n= n || 1부품을 제거 하거나 n정의되어 있지 않은지 확인 하여 0시간 을 반복 할 수도 있습니다 .
chodorowicz

3
ES6에 대한 Mozilla의 공식 polyfill도 살펴보십시오 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Eirik Birkeland

3
@ChrisV는, String.repeat내가 :) 2012 년을 쓸 때 내 포인트는 유효 생각 그래서 6 월에만 2015 년까지 확정되지 않았다 ES6에 추가되었습니다
tuomassalo

13

가장 성능이 좋은 방법은 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat입니다.

짧은 버전은 다음과 같습니다.

  String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
      if (count & 1) result += pattern;
      count >>>= 1, pattern += pattern;
    }
    return result + pattern;
  };
  var a = "a";
  console.debug(a.repeat(10));

Mozilla의 폴리 필 :

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

이것은 좋은 것이지만 새로운 기본 "반복"은 훨씬 빠르며 구현할 필요가 없습니다.
Goty Metal

1
의 의미에 대해 자세히 설명해 주 count >>>= 1, pattern += pattern;시겠습니까? 어떤 말입니까?
Tsahi Asher

그렇다면 이것은 기본 반복에 대한 폴리 필입니다. 그냥 추가 if (!String.prototype.repeat) {시작과 }끝.
trlkly 2016 년

>>> = (카운트 등 >>> 카운트 = 1) 우측 시프트 부호 할당은 참조 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
user1441004

12

대안은 다음과 같습니다.

for(var word = ''; word.length < 10; word += 'a'){}

여러 문자를 반복해야하는 경우 조건부를 곱하십시오.

for(var word = ''; word.length < 10 * 3; word += 'foo'){}

참고 : 다음 과 같이 1만큼 오버 슈트 할 필요가 없습니다.word = Array(11).join('a')



10

모든 브라우저

다음 기능은 허용 된 답변에서 제안 된 옵션보다 훨씬 빠르게 수행됩니다.

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

다음과 같이 사용하십시오.

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

이 기능의 성능과 허용 된 답변에서 제안 된 옵션의 성능을 비교하려면 이 Fiddle이 Fiddle 에서 벤치 마크를 참조하십시오 .

최신 브라우저 전용

최신 브라우저에서는 다음 String.prototype.repeat방법을 사용하여이 작업을 수행 할 수 있습니다 .

var repeatedString = "a".repeat(10);

MDN 에서이 방법에 대해 자세히 알아보십시오 .

이 옵션은 더 빠릅니다. 불행히도 어떤 버전의 Internet Explorer에서도 작동하지 않습니다. 표의 숫자는이 방법을 완전히 지원하는 첫 번째 브라우저 버전을 지정합니다.

여기에 이미지 설명을 입력하십시오


9
Array(10).fill('a').join('')

가장 많이 투표 된 답변은 좀 더 간결하지만이 방법을 사용하면 추가 배열 항목을 추가 할 필요가 없습니다.


1
불행히도, fill 메소드는 IE에서 지원되지 않으며 IE와 호환되지 않는 경우 repeat 메소드를 사용할 수도 있습니다.
Michiel

1
혼자서도 fill()똑같이한다면 왜 추가 방법을 사용 join("a")
하겠습니까

7
/**  
 * Repeat a string `n`-times (recursive)
 * @param {String} s - The string you want to repeat.
 * @param {Number} n - The times to repeat the string.
 * @param {String} d - A delimiter between each string.
 */

var repeat = function (s, n, d) {
    return --n ? s + (d || "") + repeat(s, n, d) : "" + s;
};

var foo = "foo";
console.log(
    "%s\n%s\n%s\n%s",

    repeat(foo),        // "foo"
    repeat(foo, 2),     // "foofoo"
    repeat(foo, "2"),   // "foofoo"
    repeat(foo, 2, "-") // "foo-foo"
);

7

ES2015 / ES6에서는 다음을 사용할 수 있습니다 "*".repeat(n)

프로젝트에 추가하면됩니다.

  String.prototype.repeat = String.prototype.repeat || 
    function(n) {
      if (n < 0) throw new RangeError("invalid count value");
      if (n == 0) return "";
      return new Array(n + 1).join(this.toString()) 
    };

SCRIPT5029 :이 접근법을 사용하려고 할 때 배열 길이는 유한 양의 정수 여야합니다
andrepaulo

5

n 문자 를 빠르게 반복하는 또 다른 흥미로운 방법 은 빠른 지수 알고리즘의 아이디어를 사용하는 것입니다.

var repeatString = function(string, n) {
    var result = '', i;

    for (i = 1; i <= n; i *= 2) {
        if ((n & i) === i) {
            result += string;
        }
        string = string + string;
    }

    return result;
};

왜 "흥미로운 방법"이라고 말합니까? 여기서 흥미로운 점은 무엇입니까? 그것은 컴퓨터 프로그램의 가장 기본적인 기본 예인 명백한 해결책입니다.
vsync

2

내 프로젝트에서 값을 반복하려면 반복을 사용하십시오.

예를 들면 다음과 같습니다.

var n = 6;
for (i = 0; i < n; i++) {
    console.log("#".repeat(i+1))
}

이 방법은 ECMAScript 6 사양에 추가되었으므로주의하십시오.


2
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

repeatString(3,'x'); // => xxx
repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"

1

내가 사용하는 것은 다음과 같습니다.

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

0

@ bonbon 's answer 에서 확장하겠습니다 . 그의 방법은 누군가가 그렇게해야 할 경우를 대비하여 "기존 문자열에 N 문자를 추가하는"쉬운 방법입니다. 예를 들어 "google"은 1 다음에 100이 0 이기 때문 입니다.

for(var google = '1'; google.length < 1 + 100; google += '0'){}
document.getElementById('el').innerText = google;
<div>This is "a google":</div>
<div id="el"></div>

참고 : 원래 문자열의 길이를 조건부에 추가해야합니다.



0
var stringRepeat = function(string, val) {
  var newString = [];
    for(var i = 0; i < val; i++) {
      newString.push(string);
  }
  return newString.join('');
}

var repeatedString = stringRepeat("a", 1);

0

단일 라이너로도 사용할 수 있습니다.

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

모든 콘테스트에서 "for"는 "while"보다 빠릅니다. :-)
junihh


0

이것은 함수를 호출하고 Array () 및 join ()의 도움으로 결과를 얻는 방법입니다

function repeatStringNumTimes(str, num) {
  // repeat after me
  return num > 0 ? Array(num+1).join(str) : "";
}

console.log(repeatStringNumTimes("a",10))


-1
String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''); };

// console.log("0".repeat(3) , "0".repeat(-3))
// return: "000" "000"

1
String.prototype.repeat현재 브라우저에 기본적으로 포함 된 내용을 덮어 씁니다 . 또한 왜 축소합니까? 한 줄에 모두 쓸 필요는 없습니다.
Blender

IE에는 '반복'기능이 없으므로 프로토 타입이 필요합니다.
Caglayan ALTINCI

-3

여기 ES6 버전이 있습니다

const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.