Подтвердить что ты не робот

Повторить характер N раз

В Perl я могу повторить символ несколько раз, используя синтаксис:

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

Есть ли простой способ сделать это в Javascript? Я, очевидно, могу использовать функцию, но мне было интересно, есть ли какой-либо встроенный подход или какой-то другой умный метод.

4b9b3361

Ответ 1

Array(11).join("a") // create string with 10 as "aaaaaaaaaa"

(Обратите внимание, что массив длиной 11 получает только 10 "а", так как Array.join помещает аргумент между элементами массива.)

Саймон также указывает, что согласно этот jsperf, кажется, что быстрее в Safari и Chrome (но не в Firefox) повторить символ несколько раз, просто добавляя с помощью цикла for (хотя немного менее кратким).

Ответ 2

В новой гармонии ES6 у вас будет собственный способ сделать это с помощью repeat. Также ES6 сейчас только экспериментальный, эта функция уже доступна в Edge, FF, Chrome и Safari

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

И если функция повторения недоступна, вы можете использовать old-good Array(n + 1).join("abc")

Ответ 3

Удобно, если вы много повторяетесь:

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


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

Ответ 4

Самый эффективный способ - 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));

Polyfill из 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;
  }
}

Ответ 5

Если вы не возражаете против включения библиотеки в свой проект, lodash имеет функцию повторения.

_.repeat('*', 3);
// → '***

https://lodash.com/docs#repeat

Ответ 6

Альтернативой является

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

Если вам нужно повторить несколько символов, умножьте условное:

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

ПРИМЕЧАНИЕ: Вам не нужно превышать 1, как с помощью word = Array(11).join('a')

Ответ 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()) 
    };

Ответ 8

Для всех браузеров

Следующая функция будет выполнять намного быстрее, чем вариант, предложенный в принятом ответе:

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

Вы бы использовали его следующим образом:

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

Чтобы сравнить производительность этой функции с параметром, предложенным в принятом ответе, см. this Fiddle и этот скрипт для тестов.

Только для современных браузеров

В современных браузерах вы можете сделать это с помощью метода String.prototype.repeat:

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

Подробнее об этом методе см. MDN.

Эта опция еще быстрее. К сожалению, он не работает ни в одной версии Internet Explorer. Числа в таблице определяют первую версию браузера, полностью поддерживающую метод:

введите описание изображения здесь

Ответ 9

Еще один интересный способ быстро повторить 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;
};

Ответ 10

/**  
 * 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"
);

Ответ 11

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

Хотя самый проголосовавший ответ немного более компактен, при таком подходе вам не нужно добавлять дополнительный элемент массива.

Ответ 12

Для повторения значения в моих проектах я использую повтор

Например:

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

но будьте осторожны, потому что этот метод был добавлен в спецификацию ECMAScript 6.

Ответ 13

Вот что я использую:

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

Ответ 14

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

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

Ответ 15

Я собираюсь расширить @bonbon answer. Его метод - это простой способ "добавить N символов к существующей строке", на всякий случай, если кто-то должен это сделать. Например, поскольку "google" - это 1, за которым следуют 100 нулей.

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>

Ответ 16

Вы также можете попробовать эту простую функцию, которую я нашел в исходном коде node.js:

function repeatString(str, len) {
  return Array.apply(null, {
    length: len + 1
  }).join(str).slice(0, len)
}

Ответ 17

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"

Ответ 18

Lodash предлагает аналогичную функциональность, как Повтор Javascript(), которая недоступна во всех браузерах. Он называется _. Repeat и доступен с версии 3.0.0:

_.repeat('a', 10);

Ответ 19

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

Ответ 20

Может использоваться как однострочный:

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

Ответ 21

В CoffeeScript:

( 'a' for dot in [0..10]).join('')

Ответ 22

Вот версия ES6

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