Идиома для "повторения n раз"?


EDIT: Голоса для закрытия ошибочны. Принятый ответ в Repeat Character N Times вообще не применим. Например:

>>> Array(3).map(Math.random)
[undefined, undefined, undefined]

В двух других ответах предлагается изменить встроенный класс, что я считаю совершенно неприемлемым.


Здесь один довольно расточительный и непрактичный способ создания массива из 3 случайных чисел в JS:

>>> [1, 1, 1].map(Math.random)
[0.6324464592887568, 0.5969209806782131, 0.7362755801487572]

Использование фиктивного массива (например, [1, 1, 1]) только для того, чтобы можно было называть его map, при достаточно большом n и расточительном (памяти), и непрактичном.

То, что хотелось бы, было бы чем-то вроде гипотетического:

>>> repeat(3, Math.random)
[0.21425955396598173, 0.00226050232425945, 0.45261888146445495]

Какой самый близкий человек может прийти к этому в "чистом JS"?

(Я знаю Underscore, но в его API есть вещи, которые не имеют для меня никакого смысла, такие как интерпретация map, поэтому я стараюсь избегать этого.)

Ответ 1

Underscore.js имеет функцию времени, которая делает именно то, что вы хотите:

_.times(3, Math.random)

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

times = function(n, iterator) {
  var accum = Array(Math.max(0, n));
  for (var i = 0; i < n; i++) accum[i] = iterator.call();
  return accum;
};

Ответ 2

Это можно сделать с помощью Array.prototype.map, но массив не может быть пустым. Заполните это сначала:

console.log(
    Array(3).fill().map(Math.random)
);

Ответ 3

короткий элегантный ES6:

let times=(n,f)=>{while(n-->0)f();}

о, Это не для создания массива, но это все еще аккуратно!

times(3,()=>print('wow'))

или стиль Ruby:

Object.assign(Number.prototype,{times(f){x=this;while(x-->0)f();}})
3..times(()=>print('wow'))

Ответ 4

Может быть, Array.from вызов Array.from может быть Array.from:

var result = Array.from(Array(3), Math.random);

console.log(result);

Ответ 5

Мне нравится этот способ:

[...Array(5).keys()].forEach(index =>
  console.log('do something ${index}'
)

Ответ 6

Современный способ создания этой функции repeat:

repeat = (n, cb) => {[...Array(n)].forEach(cb)}

Затем вы можете использовать его с:

repeat(3, _ => console.log(Math.random()))

Выпустил бы:

0.6324464592887568
0.5969209806782131
0.7362755801487572