Nejlepší způsob, jak vytvořit pole celých čísel od 1..20 v JavaScriptu

Jaký by byl nejlepší způsob, jak vytvořit toto pole:

var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
         11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

Například for smyčka:

var x = [];
for (var i=1;i<=20;i++) {
  x.push(i);
}

Nebo while smyčka:

var x = [], i = 1, endInt = 20;
while (i <= endInt) {
  x.push(i);
  i++;
}

Byly by další příklady, které by byly stručnější – jinými slovy – méně kódu? Myslím na věci jako v Ruby, kde by ekvivalentní kód, o kterém si myslím, že by byl tak jednoduchý jako 1..20 . Neznám takovou syntaxi v JavaScriptu, ale zajímalo by mě, jestli existují kratší způsoby, jak udělat totéž.

AKTUALIZACE: Nemyslel jsem na odstranění středníků nebo var pro odpovědi v otázce, ale musím přiznat, že otázka to naznačuje. Jsem zvědavější na algoritmy než na shazování bajtů. Omlouvám se, pokud jsem byl nejasný! Také vytvoření funkce je dostatečně jednoduché, stačí plácnout function range(start, end) { /* guts here */ } kolem toho a jste tam. Otázkou je, zda existují nové přístupy k „vnitřnostem“.

Odpověď

Když se nad tím trochu zamyslím, jedná se o nejkratší implementaci standardu range(N) funkce v JavaScriptu, se kterou bych mohl přijít:

function range1(i){return i?range1(i-1).concat(i):[]}

Poznámka :Nepoužívejte toto ve výrobě; je to O(N^2)

Porovnejte s aktuální odpovědí s nejvyšším hlasováním:

function range1(i){var x=[];var i=1;while(x.push(i++)<i){};return x}

Příklad:

> range1(5)
[1, 2, 3, 4, 5]

Je to jako plakátové dítě pro rekurzi, i když jsem čekal, že to bude delší, dokud mě nenapadlo ternární-if-příkaz, který to stáhne na 42 nezbytných znaků.

Všimněte si, že „standardní“ range funkci vracející [start,end) lze zapsat provedením .concat(i-1) .

Aktualizace:Ooh, objevil jsem neuvěřitelně krátkou verzi s ošklivou imperativní syntaxí zneužitím pro smyčky, obráceného řazení, skutečnosti, že přiřazení vrací hodnotu:for(y=[],i=20;y[--i]=i;){} skládající se pouze z 25 znaků (ačkoli budete chtít var y které můžete vložit do smyčky for a +1, pokud nechcete, 0…19). I když není kratší, pokud potřebujete definovat funkci, je kratší než i?r(i-1).concat(i):[] pokud nepotřebujete vytvořit funkci.

Oblíbená metoda

Aktualizace 13. září 2015:

Právě jsem přišel s touto novou metodou, která funguje s prohlížeči, které podporují standard ES6:

> Array(5).fill().map((x,i)=>i)
[0, 1, 2, 3, 4]

Také toto:

> Array.from(Array(5),(x,i)=>i)
[0, 1, 2, 3, 4]

Přidány některé testovací případy profilování výkonu:zdá se, že všechno kromě standardního in-order for-loop je 10x pomalejší, alespoň na V8. https://jsperf.com/array-range-in-javascript (Samozřejmě, na ničem z toho nezáleží, pokud programujete ve funkčním stylu a stejně byste zasáhli každý prvek voláním funkce.)