Array.prototype.fill () con object passa riferimento e non nuova istanza

Solo una piccola domanda

Stavo giocando un po ‘e stavo cercando di creare un’istanza di una nuova lunghezza di x, dove tutti gli elementi di quell’array erano inizializzati su un valore y

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

Funziona bene se il valore di y è qualcosa di diverso da un object . Il significato che è y è un object, il seguente è vero:

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

C’è un modo per affermare che dovrebbe essere creato un nuovo object per ogni elemento mentre si utilizza la funzione fill? O dovrei semplicemente convertirlo in un ciclo?

Grazie in anticipo!

Puoi prima fill l’array con qualsiasi valore (es. undefined ), e poi sarai in grado di usare la map :

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

La risposta accettata è buona e funzionerebbe nel 90% dei casi.

Ma se stai realizzando applicazioni JS ad alte prestazioni, e se lavori con array grandi / enormi, Array.map (..) crea un grande sovraccarico in entrambi i casi – utilizzo di memoria e processore, poiché crea una copia dell’array.

Raccomando di usare il classico per loop:

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

Ho provato tre alternative e ho ottenuto questo:

  • Risposta proposta ( 11 volte più !!! più lenta):

     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 ( 2 volte più lento):

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

PS. Ho usato questo violino per i test.

Una soluzione performante: Array.from({ length: 5 }, () => new Object())

La risposta di Ilias Karim è eccellente. Ho appena fatto quanto segue:

 a = Array.from({length:l}, () => new Array(c).fill(prefix)); 

per creare un array 2D pre-riempito della dimensione specificata, l per c, riempito con prefisso. Ora il mio codice può riempire gli slot nella matrice 2D che richiedono valori non prefissati.