Comment est un JavaScript de hachage de la carte de mise en œuvre?
Je travaille actuellement avec OpenLayers et ont un vaste ensemble de données pour tirer dans une couche vecteur (supérieur à 100 000 vecteurs).
Je vais maintenant essayer de mettre tous ces vecteurs dans un JavaScript de hachage carte pour analyser la performance. Je veux savoir combien de hachage est la carte en JavaScript mis en œuvre, est-il un véritable fonction de hachage ou tout simplement un enveloppé fonction qui utilise une simple structure de données et un algorithme de recherche?
- Il n'y a pas qu'un seul de JS mise en œuvre, donc il n'y a aucun moyen de répondre à cette question. ECMAScript ne précise pas quelle structure de données à utiliser pour les objets, ni de spécifier des contraintes sur le temps d'accès. Les hachages sont typiques, mais équilibrée, les arbres pouvaient être utilisés.
- ES6 ont pur Cartes. Le lien décrit les différences entre la plaine de l'objet et de la Carte, la clé de détails: MDN JavaScript Map
Vous devez vous connecter pour publier un commentaire.
chaque objet javascript est une simple table de hachage qui accepte uniquement de la chaîne de valeur en tant que clé, de sorte que vous pouvez écrire votre code:
objet javascript est un véritable table de hachage sur sa mise en œuvre, de sorte que la complexité de la recherche est O(1), mais il n'est pas dédié
hashcode()
fonction pour les chaînes de caractères javascript, il est mis en œuvre en interne par le moteur javascript (V8, SpiderMonkey, JScript.dll, etc...)cependant, javascript, aujourd'hui, ne supporte pas l'autre type de données à l'exception de chaîne en touche, ECMAv6 (harmonie) d'introduire un WeakMap classe qui acceptent n'importe quel objet comme un élément clé, mais ce serait un long moment...
map[2] = 'foo'
mais il est rejeté à une chaîne en interne> map = { '2': 'foo' }
Des objets JavaScript ne peut pas être mis en œuvre uniquement sur le haut de hachage cartes.
Essayer cette dans votre navigateur de la console:
...et vous allez recevoir de nouveau dans l'ordre d'insertion, qui est norme de facto comportement.
De hachage cartes, intrinsèquement, ne pas maintenir l'ordre, si les implémentations JavaScript peut utilisation de hachage cartes en quelque sorte, mais s'ils le font, il va me falloir au moins un index séparé et un supplément de comptabilité pour les insertions.
Voici une vidéo de Lars Bak expliquant pourquoi v8 ne pas utiliser hachage cartes à mettre en œuvre des objets.
Ici est un moyen facile et pratique d'utiliser quelque chose de similaire à Java carte:
Et pour obtenir la valeur:
Devriez-vous essayer cette classe
Map
:JS:
Avis: la clé et la valeur peut être n'importe quel type.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Tandis que la plaine de vieux objets JavaScript peut être utilisé comme maps, elles sont généralement mises en œuvre de manière à préserver l'insertion de l'ordre pour assurer la compatibilité avec la plupart des navigateurs (voir Craig Barnes réponse) et ne sont donc pas de simples cartes de hachage.
ES6 introduit bonne Cartes (voir MDN JavaScript Carte) dont la la norme dit:
J'ai été en cours d'exécution dans le problème que j'ai eu le json avec certaines clés communs. Je voulais le groupe de toutes les valeurs ayant la même clé. Après le surf, j'ai trouvé hashmap paquet. Ce qui est vraiment utile.
De groupe de l'élément avec la même clé, j'ai utilisé
multi(key:*, value:*, key2:*, value2:*, ...)
.Ce paquet est un peu similaire à Java Hashmap collection, mais pas aussi puissant que Java Hashmap.