Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Clés de tables de hachage

2 réponses
Avatar
Yliur
Bonjour

J'ai tâché d'utiliser des tables de hachage en javascript. Enfin le
machin qui en tient lieu, avec des associations clé/valeur.

Quelque chose comme ça :
var table = {} ;
table['truc'] = 'coucou' ;

J'arrive à m'en servir sous cette forme, ça fonctionne. Par contre j'ai
voulu utiliser ce système pour mémoriser les éléments html déjà traités
lors d'un parcours d'arbre du DOM et là ça s'est moins bien passé : La
première fois table[elt] renvoie bien faux (elle est vide), mais toutes
les fois suivantes l'expression renvoie vrai, quel que soit l'élément
html qui lui est présenté.

Est-ce que ce système ne fonctionne qu'avec certains types de données
pour les clés ? Ou je me suis juste planté quelque part ?

Ensuite j'ai essayé de placer les éléments dans un tableau et de
parcourir le tableau quand on nouveau nœud est traité pour voir s'il
s'y trouve déjà. le résultat a été le même, dès le deuxième tous les
éléments présentés ont été trouvés dans le tableau. Ça c'est encore
plus bizarre, je me dis que j'ai dû me planter dans mon test mais comme
je ne sais pas bien comment fonctionnent les comparaisons je voulais
m'assurer que je ne loupe pas un truc.

Merci

Yliur

2 réponses

Avatar
Paul Gaborit
À (at) Tue, 7 Jul 2015 09:12:34 +0200,
Yliur écrivait (wrote):

J'ai tâché d'utiliser des tables de hachage en javascript. Enfin le
machin qui en tient lieu, avec des associations clé/valeur.

Quelque chose comme ça :
var table = {} ;
table['truc'] = 'coucou' ;



Ici, la clé est une chaîne de caractères : 'truc'.

J'arrive à m'en servir sous cette forme, ça fonctionne. Par contre j'ai
voulu utiliser ce système pour mémoriser les éléments html déjà traités
lors d'un parcours d'arbre du DOM et là ça s'est moins bien passé : La
première fois table[elt] renvoie bien faux (elle est vide), mais toutes
les fois suivantes l'expression renvoie vrai, quel que soit l'élément
html qui lui est présenté.



La question à se poser est la nature de elt.

Si c'est une variable qui contient une chaîne, cette valeur sera utilisé
comme clé et ça fonctionnera comme au-dessus.

Si c'est une variable qui contient un objet, c'est l'objet converti en
chaîne qui sera utilisé comme clé. Or tous les objets une fois convertis
en chaîne donnent la chaîne "[object Object]".

Une solution consiste à utiliser 'JSON.stringify(elt)' comme clé plutôt
que 'elt'. Une autre solution consiste à utiliser une Map.

Est-ce que ce système ne fonctionne qu'avec certains types de données
pour les clés ? Ou je me suis juste planté quelque part ?



Les clés sont *toujours* des chaînes.

Quelques liens (en anglais):

<http://stackoverflow.com/questions/12386450/using-an-object-as-a-property-key-in-javascript>

<http://stackoverflow.com/questions/28989091/using-javascript-object-as-object-key>


--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Yliur
Le Tue, 07 Jul 2015 11:36:18 +0200
Paul Gaborit a écrit :


À (at) Tue, 7 Jul 2015 09:12:34 +0200,
Yliur écrivait (wrote):

> J'ai tâché d'utiliser des tables de hachage en javascript. Enfin le
> machin qui en tient lieu, avec des associations clé/valeur.
>
> Quelque chose comme ça :
> var table = {} ;
> table['truc'] = 'coucou' ;

Ici, la clé est une chaîne de caractères : 'truc'.

> J'arrive à m'en servir sous cette forme, ça fonctionne. Par contre
> j'ai voulu utiliser ce système pour mémoriser les éléments html
> déjà traités lors d'un parcours d'arbre du DOM et là ça s'est moins
> bien passé : La première fois table[elt] renvoie bien faux (elle
> est vide), mais toutes les fois suivantes l'expression renvoie
> vrai, quel que soit l'élément html qui lui est présenté.

La question à se poser est la nature de elt.

Si c'est une variable qui contient une chaîne, cette valeur sera
utilisé comme clé et ça fonctionnera comme au-dessus.

Si c'est une variable qui contient un objet, c'est l'objet converti en
chaîne qui sera utilisé comme clé. Or tous les objets une fois
convertis en chaîne donnent la chaîne "[object Object]".

Une solution consiste à utiliser 'JSON.stringify(elt)' comme clé
plutôt que 'elt'. Une autre solution consiste à utiliser une Map.

> Est-ce que ce système ne fonctionne qu'avec certains types de
> données pour les clés ? Ou je me suis juste planté quelque part ?

Les clés sont *toujours* des chaînes.

Quelques liens (en anglais):

<http://stackoverflow.com/questions/12386450/using-an-object-as-a-property-key-in-javascript>

<http://stackoverflow.com/questions/28989091/using-javascript-object-as-object-key>



Map a l'air intéressant mais c'est supporté dans une version très
récente du standard ecmascript, donc un peu délicat à utiliser. Je vais
sans doute faire autrement.

Merci pour les infos en tout cas :) .