2012-01-16 14 views
55

Attualmente lavoro con OpenLayers e ho un enorme set di dati da disegnare in un livello vettoriale (superiore a 100000 vettori).Come viene implementata una mappa hash JavaScript?

Ora sto provando a inserire tutti questi vettori in una mappa hash JavaScript per analizzare le prestazioni. Voglio sapere come è implementata la mappa hash in JavaScript, è una vera e propria funzione di hash o semplicemente una funzione wrapper che utilizza una semplice struttura dati e un algoritmo di ricerca?

+1

Non c'è una sola implementazione JS, quindi non c'è modo di rispondere a questa. ECMAScript non specifica quale struttura dati utilizzare per gli oggetti, né specifica vincoli sul tempo di accesso. Gli hash sono tipici, ma potrebbero essere utilizzati alberi equilibrati. – outis

risposta

136

ogni JavaScript Object è un semplice hashmap che accetta solo un valore stringa come la sua chiave, così si potrebbe scrivere il codice come:

var map = {}; 
// add a item 
map[key1] = value1; 
// or remove it 
delete map[key1]; 
// or determine whether a key exists 
key1 in map; 

JavaScript Object è un vero e proprio hashmap sulla sua attuazione, così la complessità sulla ricerca è O (1), ma non esiste una funzione dedicata per stringhe javascript, è implementata internamente dal motore javascript (V8, SpiderMonkey, JScript.dll, ecc ...)

tuttavia, javascript oggi non supporta altro datatype tranne string come chiave, ECMAv6 (harmony) introdurrebbe una classe WeakMap che accetta un y oggetto come chiave, ma sarebbe molto tempo ...

+0

Perfetto. Stavo usando $ ('div # someDiv'). Data (chiave, valore) prima e questo è molto più semplice e probabilmente ha un supporto migliore anche per i browser più vecchi. Grazie – Swaroop

+0

c'è un modo per trovare la lunghezza della mappa? – Sridhar

+2

@Sridhar usa Object.keys (map) .length – otakustay

18

Ecco un modo semplice e conveniente di usare qualcosa di simile a Java map:

var map= { 
    'map_name_1': map_value_1, 
    'map_name_2': map_value_2, 
    'map_name_3': map_value_3, 
    'map_name_4': map_value_4 
    } 

E per ottenere il valore:

alert(map['map_name_1']); // fives the value of map_value_1 

...... etc ..... 
29

Gli oggetti JavaScript non possono essere implementati esclusivamente sulle mappe hash.

Prova questo nella console del browser:

var foo = { 
    a: true, 
    b: true, 
    z: true, 
    c: true 
} 

for (var i in foo) { 
    console.log(i); 
} 

... e ti riceverete di nuovo in ordine di inserimento, che è de facto standard comportamento.

Hash mappe intrinsecamente non mantengono ordinamento, in modo da implementazioni JavaScript possono uso hash mappe in qualche modo, ma se lo fanno, è necessario procurarsi almeno un indice separato e alcuni extra contabilità per inserimenti.

Ecco un video di Lars Bak explaining why v8 doesn't use hash maps to implement objects.

+2

" otakustay è tecnicamente sbagliato, il peggior tipo di errore. " È un po 'duro. Potrebbe non essere 1: 1, ma per gli scopi e gli scopi dell'uso di un hash come un dizionario, funziona allo stesso modo. – probablyup

+0

Punto giusto. L'ho moderato un po '. –

+1

Voglio solo chiarire che questo può essere vero per alcune implementazioni di JavaScript (come la maggior parte dei browser) ma non necessariamente sempre vero. L'ordine di iterazione sulle chiavi non è definito dagli standard ECMAScript e può essere qualsiasi ordine ed essere comunque un'implementazione JS valida. – TheZ

1
<html> 
<head> 
<script type="text/javascript"> 
function test(){ 
var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15} 
    alert(map['m3']); 
} 
</script> 
</head> 
<body> 
<input type="button" value="click" onclick="test()"/> 
</body> 
</html> 
3

ES6 hanno mappe pure. Il link descrive le differenze tra oggetto pianura e mappa, dettagli chiave ecc:

MDN JavaScript Map

1

Mentre gli oggetti semplici vecchi JavaScript possono essere utilizzati come mappe, di solito sono implementati in un modo per preservare l'inserimento-ordine per la compatibilità con la maggior parte browser (vedi la risposta di Craig Barnes) e quindi non sono semplici mappe di hash.

ES6 introduce funzione propria (vedi MDN JavaScript Map) il cui standard says: oggetto

Map deve essere realizzato utilizzando sia le tabelle hash o altri meccanismi che, in media, forniscono tempi di accesso che sono sublineare sul numero di elementi nella collezione.

0

dovrebbe tentare questa classe Map:

var myMap = new Map(); 
 

 
// setting the values 
 
myMap.set("1", 'value1'); 
 
myMap.set("2", 'value2'); 
 
myMap.set("3", 'value3'); 
 

 
myMap.size; // 3 
 

 
// getting the values 
 
myMap.get("1"); // "value associated with "value1" 
 
myMap.get("2");  // "value associated with "value1" 
 
myMap.get("3");  // "value associated with "value3"

Avviso: chiave e il valore può essere di qualsiasi tipo.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

Problemi correlati