2013-08-28 29 views
22

EDYCJA: Głosy do zamknięcia są błędne. Przyjęta odpowiedź w Repeat Character N Times nie ma zastosowania w ogóle. Np .:Idiom dla "powtórzyć n razy"?

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

Pozostałe dwie odpowiedzi zaproponować modyfikację wbudowany w klasie, w praktyce, że uważam za całkowicie nie do przyjęcia.


Oto jeden nieco rozrzutny i niepraktyczny sposób wytwarzania tablicę 3 liczb losowych w JS:

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

Zastosowanie manekina tablicy (np [1, 1, 1]) tak, że można zadzwonić map na jest to, dla wystarczająco dużego rozmiaru, zarówno marnotrawstwo (pamięci), jak i niepraktyczne.

Co chciałoby byłoby coś hipotetyczny:

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

Jaka jest najbliżej można dojść do tego w „czystej” JS?

(Jestem świadomy podkreślenia, ale nie ma rzeczy w API, które nie ma sensu do mnie, takich jak interpretacja map, więc staram się go unikać.)

+1

możliwy duplikat o f [Powtarzaj postać N razy] (http://stackoverflow.com/questions/1877475/repeat-character-n-times). To pytanie wymaga nieco więcej niż twojego, ale koncepcja (tworzenie tablicy n elementów) jest taka sama. Ostatecznie po prostu użyj 'Tablica (n + 1)' –

+0

Czy chcesz liczb całkowitych? Losowa liczba między czym a czym? – PHPglue

+1

@SimpleCoder: W moim oświadczeniu na pytanie wprost odrzuciłem "[1,1,1] .map (Math.random) za marnotrawstwo. Czym różni się "Array (3) .map (Math.random)? Oczywiście wiem, że dla * n * = 3 odpady są pomijalne, ale nie dla większych * n *. – kjo

Odpowiedz

31

underscore.js ma times funkcja, która robi dokładnie to, co chcesz:

_.times(3, Math.random) 

Jeśli nie chcesz używać podkreślenia można po prostu napisać własny times funkcję (kopiowane i nieco uproszczone ze źródła podkreślenia):

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

downvote, ponieważ jest więcej aktualnych i lepszych odpowiedzi za mniej głosów. – quinn

7

shortmost elegancki ES6:

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

Och, to nie jest do tworzenia tablicę, ale nadal jest czysty!

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

lub Ruby styl:

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

Chciałbym podkreślić, że 'n -> 0' nie jest jakimś operatorem strzałki, to' n--> 0'. To jest fajne. – Noumenon

+4

Zabawne, że możesz przeczytać "while (n -> 0)" jako "while n zbliża się do zera", nawet jeśli nie jest semantycznie poprawne;) – Anona112

+1

Jeśli możesz przyjąć, że 'n' jest liczbą całkowitą, możesz usunąć' > 0' sprawdzić, ponieważ gdy 'n' trafi zero, będzie równało się false. Niecałkowita 'n' spowoduje jednak nieskończoną pętlę. –

7

Może Array.from zwrotna może być użyteczne:

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

 
console.log(result);

+0

Tak, to działa jak '.map' na ostatniej tablicy, ciężko z mojego doświadczenia wynika, że ​​kilku programistów używa tego i rozumie to na pierwszy rzut oka. Ale jest całkiem czysty, lekceważący czytelność niedoświadczonych twórców – wopolow

15

To może być wykonane przy użyciu Array.prototype.map, ale tablica nie może być pusta.Wypełnij go najpierw:

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

Albo może również spread pusty array do wartości undefined przed mapowaniem, jak pusta tablica jest nadal iterable:

console.log(
 
    [...Array(3)].map(Math.random) 
 
);