Идиома для "повторения 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