2016-02-23 11 views
10

Solo una piccola domanda.Array.prototype.fill() con oggetto passa riferimento e non nuova istanza

stavo giocherellando un po 'e stava cercando di creare un'istanza di un nuovo array di lunghezza x, dove tutti gli elementi di tale matrice in cui inizializzati ad un valore y

var arr = new Array(x).fill(y); 

Questo metodo funziona bene se il valore di y è nulla diverso da un oggetto. il che significa che è y è un oggetto, quanto segue è vero:

var arr = new Array(2).fill({}); 
arr[0] === arr[1]; //is true; 
arr[0].test = 'string'; 
arr[1].test === 'string'; //is also true; 

Esiste un modo per affermare che un nuovo oggetto deve essere creato per ogni elemento durante l'uso della funzione di riempimento? O dovrei semplicemente convertirlo in un ciclo?

Grazie in anticipo!

risposta

16

È possibile prima fill l'array con un valore (ad esempio undefined), e allora si sarà in grado di utilizzare map:

var arr = new Array(2).fill().map(u => ({})); 
var arr = new Array(2).fill().map(Object); 
+0

Grazie! Ha senso! –

+0

anche 'Array.from ({length: 2}, u => ({}))' – Slai

4

La risposta accettata è buono, e avrebbe funzionato nel 90% dei casi.

Ma se si stanno facendo applicazione JS ad alte prestazioni, e se si lavora con grandi enormi array /, Array.map (..) crea grande sovraccarico sia - memoria e utilizzo del processore, in quanto crea un copia di matrice.

vi consiglio di usare il classico per ciclo:

a = new Array(ARRAY_SIZE); 
    for (var i = 0; i < ARRAY_SIZE; i++) { 
     a[i] = []; 
    } 

ho testato tre alternative e ottenuto questo:

  • soluzione proposta (11x volte !!! più lento):

    a = new Array(ARRAY_SIZE).fill().map(u => { return []; }); 
    
  • ciclo semplice (più veloce):

    a = new Array(ARRAY_SIZE); 
    for (var i = 0; i < ARRAY_SIZE; i++) { 
        a[i] = []; 
    } 
    
  • foreach (2x tempo più lento):

    a = new Array(ARRAY_SIZE).fill(); 
    a.forEach((val, i) => { 
        a[i] = []; 
    }) 
    

PS. Ho usato this fiddle per i test.

Problemi correlati