2012-01-16 11 views
55

Actualmente trabajo con OpenLayers y tengo un gran conjunto de datos para dibujar en una capa vectorial (más de 100000 vectores).¿Cómo se implementa un mapa hash de JavaScript?

Estoy tratando de poner todos estos vectores en un mapa hash de JavaScript para analizar el rendimiento. Quiero saber cómo se implementó el mapa hash en JavaScript, ¿es una función hash real o simplemente una función envolvente que usa una estructura de datos simple y un algoritmo de búsqueda?

+1

No es sólo una aplicación JS, así que no hay manera de responder a esta. ECMAScript no especifica qué estructura de datos usar para los objetos, ni especifica restricciones en el tiempo de acceso. Los hashes son típicos, pero podrían usarse árboles equilibrados. – outis

Respuesta

136

cada Javascript objeto es un HashMap simple que sólo acepta valor de cadena como clave, por lo que podría escribir el código como:

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

Javascript objeto es un verdadero mapa hash sobre su aplicación, por lo que la complejidad de la búsqueda es O (1), pero no hay una función hashcode() dedicada para las cadenas de javascript, está implementado internamente por el motor de JavaScript (V8, SpiderMonkey, JScript.dll, etc.)

sin embargo, JavaScript no es compatible con otras tipo de datos, excepto cadena como su clave, ECMAv6 (armonía) introduciría una clase WeakMap que acepta una Y como objeto fundamental, pero sería mucho tiempo ...

+0

Perfecto. Estaba usando $ ('div # someDiv'). Datos (clave, valor) antes y este es mucho más simple y probablemente también tenga mejor soporte para los navegadores más antiguos. Gracias – Swaroop

+0

¿hay alguna manera de encontrar la longitud del mapa? – Sridhar

+2

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

18

Aquí es una manera fácil y conveniente de usar algo similar a la de 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 
    } 

Y para obtener el valor:

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

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

Los objetos JavaScript no pueden implementarse puramente sobre los mapas hash.

Pruebe esto en su consola de navegador:

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

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

... y usted reciba de nuevo en orden de inserción, que es de facto standard comportamiento.

Hash mapas inherentemente no mantienen el pedido, por lo que las implementaciones de JavaScript pueden uso hash de los mapas de alguna manera, pero si lo hacen, que va a requerir al menos un índice separado y un poco de contabilidad adicional para las inserciones.

Aquí hay un video de Lars Bak explaining why v8 doesn't use hash maps to implement objects.

+2

" otakustay es técnicamente incorrecto, el peor tipo de error ". Eso es un poco duro. Puede no ser 1: 1, pero para los propósitos y propósitos de usar un hash como un diccionario, funciona de la misma manera. – probablyup

+0

Punto justo. Lo he moderado un poco. –

+1

Solo quiero aclarar que esto puede ser cierto para algunas implementaciones de JavaScript (como la mayoría de los navegadores) pero no necesariamente siempre es cierto. El orden de iteración sobre claves no está definido por los estándares ECMAScript y puede ser cualquier orden y aún así ser una implementación JS válida. – 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 have pure Maps. El enlace se describen las diferencias entre el objeto plano y mapa, detalles clave, etc:

MDN JavaScript Map

1

Mientras viejos objetos JavaScript simple se puede usar como mapas, por que se apliquen normalmente en una forma de preservar la inserción de orden para la compatibilidad con la mayoría navegadores (ver la respuesta de Craig Barnes) y por lo tanto no son simples mapas hash.

ES6 introduce Mapas adecuadas (ver MDN JavaScript Map) de los cuales el standard says: objeto

Mapa debe ser implementado utilizando cualquiera de las tablas hash u otros mecanismos que, en promedio, proporcionan tiempos de acceso que son sublinear del número de elementos en la colección.

0

debe intentar esta clase 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"

Aviso: clave y el valor puede ser cualquier tipo.

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