Повторите массив с несколькими элементами несколько раз в JavaScript
В JavaScript, как я могу повторить массив, который содержит несколько элементов, в краткой форме?
В Ruby вы могли бы сделать
irb(main):001:0> ["a", "b", "c"] * 3
=> ["a", "b", "c", "a", "b", "c", "a", "b", "c"]
Я искал библиотеку lodash и не нашел ничего, что было бы непосредственно применимо. Запрос функции: повторить массивы. это запрос функции для добавления его в lodash, и лучший способ обхода
const arrayToRepeat = [1, 2, 3];
const numberOfRepeats = 3;
const repeatedArray = _.flatten(_.times(numberOfRepeats, _.constant(arrayToRepeat)));
Вопросы Наиболее эффективный способ создания нулевого заполненного массива JavaScript? и создайте массив с одним и тем же элементом, который многократно повторяет фокус на повторении всего одного элемента несколько раз, тогда как я хочу повторить массив, который имеет несколько элементов.
Допускается использование разумно ухоженных библиотек.
Ответы
Ответ 1
Нет необходимости в какой-либо библиотеке, вы можете использовать Array.from
для создания массива массивов, которые вы хотите повторить, а затем сгладить с помощью [].concat
и spread:
const makeRepeated = (arr, repeats) =>
[].concat(...Array.from({ length: repeats }, () => arr));
console.log(makeRepeated([1, 2, 3], 2));
Ответ 2
Вы можете использовать конструктор Array
вместе с его методом fill
чтобы заполнить его несколько раз массива, который вы хотите повторить, а затем concat
их (подмассивы) в один массив:
const repeatedArray = [].concat(...Array(num).fill(arr));
Примечание. В старых браузерах (pre-ES6) вы можете использовать Function#apply
чтобы имитировать синтаксис concat
выше (concat
будет вызываться с каждой из подчиненных ему массивов, переданных ему как аргумент):
var repeatedArray = [].concat.apply([], Array(num).fill(arr));
Пример:
const arrayToRepeat = [1, 2, 3];
const numberOfRepeats = 3;
const repeatedArray = [].concat(...Array(numberOfRepeats).fill(arrayToRepeat));
console.log(repeatedArray);
Ответ 3
Моя первая идея заключалась бы в создании такой функции
let repeat = (array, numberOfTimes) => Array(numberOfTimes).fill(array).reduce((a, b) => [...a, ...b], [])
console.log(repeat(["a", "b", "c"], 3))
Ответ 4
Рекурсивная альтернатива:
const repeat = (a, n) => n-- ? a.concat(repeat(a, n)) : [];
console.log( repeat([1, 2], 3) )
Ответ 5
К сожалению, это невозможно изначально в JS (также невозможна перегрузка оператора, поэтому мы не можем использовать что-то вроде Array.prototype.__mul__
), но мы можем создать массив с правильной длиной цели, заполнить заполнителями, сопоставьте значения:
const seqFill = (filler, multiplier) =>
Array(filler.length * multiplier)
.fill(1)
.map(
(_, i) => filler[i % filler.length]
);
console.log(seqFill([1,2,3], 3));
console.log(seqFill(['a','b','c', 'd'], 5));
Ответ 6
Помимо очевидного решения [].concat
+ Array.from({length: 3}, …)
/fill()
, использование генераторов приведет к элегантному коду:
function* concat(iterable) {
for (const x of iterable)
for (const y of x)
yield y;
}
function* repeat(n, x) {
while (n-- > 0)
yield x;
}
const repeatedArray = Array.from(concat(repeat(3, [1, 2, 3])));
Вы также можете сократить его до
function* concatRepeat(n, x) {
while (n-- > 0)
yield* x;
}
const repeatedArray = Array.from(concatRepeat(3, [1, 2, 3]));
Ответ 7
Хотя другие методы работают просто, они тоже.
Array.fill()
и Array.from()
в предыдущих методах не будут работать в IE
. Документы MDN для справки
Mehtod 1: Loop и push (Array.prototype.push) то же самое в массиве.
function mutateArray(arr,n)
{
var temp = [];
while(n--) Array.prototype.push.apply(temp,arr);
return temp;
}
var a = [1,2,3,4,5];
console.log(mutateArray(a,3));