web-dev-qa-db-fra.com

Comment une carte de hachage JavaScript est-elle mise en œuvre?

Je travaille actuellement avec OpenLayers et dispose d’un grand nombre de données à dessiner dans un calque vectoriel (supérieur à 100 000 vecteurs).

J'essaie maintenant de mettre tous ces vecteurs dans une carte de hachage JavaScript pour analyser les performances. Je veux savoir comment la carte de hachage dans JavaScript est implémentée, est-ce une vraie fonction de hachage ou juste une fonction encapsulée utilisant une structure de données simple et un algorithme de recherche?

69
Patrick H.

chaque objet javascript est un hashmap simple qui n'accepte que la valeur de chaîne comme clé. Vous pouvez donc écrire votre code comme suit:

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

l'objet javascript est un véritable hashmap sur son implémentation, la complexité de la recherche est donc O (1), mais il n'existe pas de fonction hashcode() dédiée pour les chaînes javascript, elle est implémentée en interne par le moteur javascript (V8, SpiderMonkey, JScript.dll, etc.). ..)

cependant, aujourd'hui, javascript ne prend pas en charge les autres types de données, à l'exception de chaîne, car sa clé, ECMAv6 (harmonie) introduirait une classe WeakMap acceptant n'importe quel objet en tant que clé, mais le temps serait long ...

166
otakustay

Les objets JavaScript ne peuvent pas être implémentés uniquement au-dessus des cartes de hachage.

Essayez ceci dans la console de votre navigateur:

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

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

... et vous les recevrez dans l'ordre d'insertion, ce qui est standard de facto comportement.

Les cartes de hachage ne conservent pas en soi l'ordre, donc les implémentations JavaScript peuvent utiliser des cartes de hachage d'une manière ou d'une autre, mais si elles le font, il faudra au moins un index séparé et une comptabilité supplémentaire pour les insertions.

Voici une vidéo de Lars Bak expliquant pourquoi la v8 n'utilise pas de hash maps pour implémenter des objets .

31
Craig Barnes

Voici un moyen simple et pratique d’utiliser quelque chose de similaire à 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
    }

Et pour obtenir la valeur:

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

......  etc  .....
19
Miloš

Si vous essayez cette 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"

Remarque: la clé et la valeur peuvent être n’importe quel type.

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

4
Nguyen Tan Dat

Bien que de vieux objets JavaScript simples puissent être utilisés en tant que cartes, ils sont généralement implémentés de manière à préserver l'ordre d'insertion afin d'assurer la compatibilité avec la plupart des navigateurs (voir la réponse de Craig Barnes) et ne sont donc pas de simples cartes de hachage.

ES6 introduit les cartes appropriées (voir MDN JavaScript Map ) dont le standard dit :

Les objets de carte doivent être implémentés à l'aide de tables de hachage ou d'autres mécanismes fournissant en moyenne des temps d'accès sous-linéaires pour le nombre d'éléments de la collection.

2
mb21
<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>
1
rajendra kumar

Je courais dans le problème où j'ai eu le JSON avec des clés communes. Je voulais regrouper toutes les valeurs ayant la même clé. Après avoir surfé, j'ai trouvé package hashmap . Ce qui est vraiment utile.

Pour regrouper l'élément avec la même clé, j'ai utilisé multi(key:*, value:*, key2:*, value2:*, ...).

Ce paquet est quelque peu similaire à la collection Java Hashmap, mais pas aussi puissant que Java Hashmap.

0
dd619