Повторите массив с несколькими элементами несколько раз в 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));