2012-05-04 13 views
18

Qual è il modo più efficiente per creare dinamicamente questo semplice array.javascript - Create Simple Dynamic Array

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]; 

Diciamo che siamo in grado di ottenere il numero 10 da una variabile

var mynumber = 10; 
+0

ricorsione in coda sarebbe più elaborato. – joshp

+0

@joshp bene ha detto "più efficiente", quindi vorrei andare con un ciclo for: P –

+3

vuoi davvero quei numeri da memorizzare come stringhe? – BiAiB

risposta

41
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push(i.toString()); 
} 
+0

non è molto salutare espandere la matrice su ogni ciclo, questo è quasi inevitabile la maggior parte delle volte, ma questa volta ne conosciamo la lunghezza. (vedi il mio ans per maggiori informazioni) – ajax333221

4

Suona come si desidera solo di costruire un array che contiene le versioni di stringa dei valori interi. Un approccio semplice:

var arr = []; 
for (var i = 1; i <= mynumber; i++) arr.push(""+i); 

Per una versione più interessante si potrebbe fare un generatore di ...

function tail(i, maxval) { 
    return [i].concat(i < maxval ? tail(i+1, maxval) : []); 
} 

var arr = tail(1, mynumber); 
+0

Sarebbe più veloce se myumber fosse locale all'interno della funzione tail. –

+0

Vero - sebbene stavo pensando a un certo punto sulla funzione range python (START, STOP, STRIDE). – koblas

2
var arr = []; 
while(mynumber--) { 
    arr[mynumber] = String(mynumber+1); 
} 
+0

Questo è stato il mio primo pensiero. Efficiente e conciso. –

+0

Potrebbe essere più veloce unire/riscrivere l'array intero in questi esempi piuttosto che convertirlo uno alla volta. per esempio. dopo i loop: 'arr = arr.join ('_'). split ('_');' e rimuove i passi 'String ()'. –

0

Se ti stai chiedendo se c'è una costruito nel Pythonic range - come funzione, non c'è. Devi farlo in modo brutale. Forse rangy ti interesserebbe.

1

ha letto erroneamente la domanda, corretta. Prova:

var myNumber = 100, 
    myarr = (function arr(i){return i ? arr(i-1).concat(i) : [i]}(myNumber)); 

Solo per divertimento, se si estende Array in questo modo:

Array.prototype.mapx = function(callback){ 
    return String(this).split(',').map(callback); 
} 

si potrebbe usare:

var myNum = 100, 
    myarr = new Array(myNum).mapx(function(el,i){return i+1;}); 
+1

ok, adesso cambio 'mynumber = 100;' .. per favore scrivi la stringa lunga per me. –

+0

Vedere la mia modifica. Suppongo che non sia così efficiente in termini di cicli di CPU, ma è breve. – KooiInc

+0

+1 da parte mia per il generatore freddo. –

-2

Allo stesso modo si farebbe per tutti gli array che si desidera riempire in modo dinamico. A per ciclo. codice Suedo è

arr =array() 
for(i; i<max; i++){ 
arr[]=i 

} 

che dovrebbe aiutare sulla strada

+1

usa 'var i' per evitare i globals, usa' new Array() 'o anche meglio' [] 'invece di' array() ', dai un valore di inizio 'i', specifica un indice qui' arr [] =. ..', crea le stringhe di valori, l'intervallo non è corretto (devi usare '<=' o regolare l'intervallo aggiungendo +1 o qualcosa) – ajax333221

0
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push("" + i); 
} 

Questo sembra essere più veloce in Chrome, secondo JSPerf, ma tieni presente che è tutto molto navigatore dipendente.

C'è 4 cose che si possono cambiare su questo frammento:

  1. Usa for o while.
  2. Utilizzare il ciclo avanti o indietro (con la creazione di file sparse all'indietro all'inizio)
  3. Utilizzare push o accedere direttamente dall'indice.
  4. Utilizzare la stringa implicita o chiamare esplicitamente toString.

In ogni browser, la velocità totale sarebbe la combinazione di quanto migliore ogni opzione per ciascun elemento in questo elenco viene eseguita in quel particolare browser.

TL; DR: probabilmente non è una buona idea provare a ottimizzare questo particolare pezzo.

+0

perché dosare la variabile inizio con 1 anziché 0? –

+0

@JinnySong, hai letto la domanda? Mostra una matrice che inizia con "" 1 "'. –

8

Ecco come lo farei:

var mynumber = 10; 
var arr = new Array(mynumber); 

for (var i = 0; i < mynumber; i++) { 
    arr[i] = (i + 1).toString(); 
} 

La mia risposta è praticamente la stessa di tutti, ma nota che ho fatto qualcosa di diverso:

  • E 'meglio se si specifica la lunghezza campo ed non forzarlo per espandere ogni volta

Così ho creato l'array con new Array(mynumber);

3

Con ES2015, questo può essere raggiunto sinteticamente in una singola espressione utilizzando il metodo Array.from modo:

Array.from({ length: 10 }, (_, idx) => `${++idx}`) 

Il primo argomento from è un array come oggetto che fornisce una proprietà length. Il secondo argomento è una funzione mappa che ci consente di sostituire i valori di default undefined con i loro valori di indice corretti come richiesto. Verifica le specifiche here

+0

una cosa da ricordare: puoi usare qualsiasi nome di variabile invece di '_', la prima proprietà della funzione mappa rappresenta il valore corrente dell'elemento Array (arr [idx]). in questo esempio è sempre 'indefinito' – Lusk116

2

Farei come segue;

var num = 10, 
 
    dynar = [...Array(num)].map((_,i) => ++i+""); 
 
console.log(dynar);

0
Array.apply(null, new Array(10)).map((el, i) => ++i + "") 
+4

Sebbene questo snippet di codice possa risolvere la domanda, [inclusa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entually-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice.Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni! –