2015-09-18 37 views
6

Sto tentando di aggiornare il mio codice su ES6 poiché sto utilizzando il Nodo 4.0 e le sue funzionalità sono davvero simili. Tuttavia, ho problemi con la nuova struttura dati ES6 Map in quanto si comporta in modo diverso a {} quando si utilizza Array come chiave. Lo sto usando come una contro mappa.Utilizzo di oggetti Array come chiave per ES6 Mappa

Eseguo questo codice e vorrei sapere come utilizzare gli array come chiavi per lo Map.

"use strict"; 

var a = new Map(); 
a.set(['x','y'], 1); 
console.log(a.get(['x','y'])); 

var b = {}; 
b[['x','y']] = 1; 

console.log(b[['x','y']]); 

esso stampa le seguenti e la prima linea dovrebbe essere 1 e non undefined:

undefined 
1 

La mappa originale JS stringifies la chiave e non sto voler fare lo stesso tipo di hack stringa i con la nuova ES6 Map.

Cosa posso fare per utilizzare gli array come chiavi in ​​modo affidabile per un ES6 Map?

risposta

9

Comprendere che i tasti mappa ES2015 vengono confrontati come se fossero con l'operatore ===. Due istanze di array, anche se contengono gli stessi valori, non si confrontano mai come === l'una con l'altra.

Prova questo:

var a = new Map(), key = ['x', 'y']; 
a.set(key, 1); 
console.log(a.get(key)); 

Poiché la classe Map è destinato ad essere utilizzabile come classe base, è possibile implementare una sottoclasse con una funzione preponderante .get(), forse.

+0

Grazie per la risposta dettagliata ma sovrascrivendo '.get()' non è quello che voglio fare – jimjampez

1

È necessario salvare un riferimento all'istanza non primitiva di Array utilizzata come chiave. Si noti la differenza tra i due esempi seguenti:

"use strict"; 
 

 
var a = new Map(); 
 
a.set(['x','y'], 1); 
 
console.log(a.get(['x','y'])); 
 
console.log(['x','y'] === ['x','y']); 
 

 
var b = new Map(); 
 
var array = ['x','y']; 
 
b.set(array, 1); 
 
console.log(b.get(array)); 
 
console.log(array === array);