Повторить строку в JavaScript заданное количество раз
В Perl я могу повторять символ несколько раз, используя следующий синтаксис:
$a = "a" x 10; // в результате получается "aaaaaaaaaa"
Существует ли простой способ сделать то же самое в Javascript? Я могу, конечно, использовать функцию, но мне было интересно, есть ли встроенный способ или какой-то другой хитрый метод для решения этой задачи.
5 ответ(ов)
Вы можете использовать следующий метод для повторения строки в JavaScript, даже если стандартный метод String.prototype.repeat
недоступен:
String.prototype.repeat = String.prototype.repeat || function(n) {
n = n || 1; // Если n не задано, устанавливаем по умолчанию 1
return Array(n + 1).join(this); // Создаем массив и соединяем элементы
}
alert('Are we there yet?\nNo.\n'.repeat(10)); // Выводим строку 10 раз
В этом коде, если метод repeat
не существует, мы добавляем его в прототип String
. Метод принимает один аргумент n
, который указывает, сколько раз нужно повторить строку. Если аргумент не передан, по умолчанию используется 1
.
Используя Array(n + 1).join(this)
, мы создаем массив с размером, равным n + 1
, и соединяем элементы, что позволяет эффективно повторять строку.
В приведенном примере строка 'Are we there yet?\nNo.\n'
будет выведена в алерте десять раз.
В то время как наиболее голосуемый ответ немного компактней, с помощью этого подхода вам не нужно добавлять лишний элемент в массив.
Код Array(10).fill('a').join('')
создает массив из 10 элементов, где каждый элемент содержит строку 'a'
, а затем объединяет их в одну строку. Это позволяет вам получить строку 'aaaaaaaaaa'
без необходимости манипуляций с массивом после его создания.
Альтернативный способ:
for(var word = ''; word.length < 10; word += 'a'){}
Если вам нужно повторить несколько символов, просто умножьте ваше условие:
for(var word = ''; word.length < 10 * 3; word += 'foo'){}
ПРИМЕЧАНИЕ: Вам не нужно заходить на 1 символ больше, как в случае с word = Array(11).join('a')
.
Наиболее производительный способ реализации метода .repeat
описан на сайте Mozilla: 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, который добавляет функцию .repeat
в String.prototype
, если она отсутствует:
if (!String.prototype.repeat) {
String.prototype.repeat = function(count) {
'use strict';
if (this == null) {
throw new TypeError('не удалось конвертировать ' + this + ' в объект');
}
var str = '' + this;
count = +count;
if (count != count) {
count = 0;
}
if (count < 0) {
throw new RangeError('число повторений должно быть неотрицательным');
}
if (count == Infinity) {
throw new RangeError('число повторений должно быть меньше бесконечности');
}
count = Math.floor(count);
if (str.length == 0 || count == 0) {
return '';
}
if (str.length * count >= 1 << 28) {
throw new RangeError('число повторений не должно превышать максимальный размер строки');
}
var rpt = '';
for (;;) {
if ((count & 1) == 1) {
rpt += str;
}
count >>>= 1;
if (count == 0) {
break;
}
str += str;
}
return rpt;
}
}
Этот полифилл обеспечивает корректную работу метода repeat
на всех поддерживаемых платформах, включая обработку исключений и эффективность работы с большими строками.
Если вы не против использовать библиотеку в вашем проекте, вы можете воспользоваться функцией repeat
из lodash. Эта функция позволяет дублировать строку заданное количество раз.
Пример использования:
_.repeat('*', 3);
// → '***'
Подробности можно найти в документации: lodash - repeat.
Как присвоить многострочную строку переменной?
Преобразование объекта JS в строку JSON
Преобразование объекта в строку
Как преобразовать строку, разделённую запятыми, в массив?
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?