66 votes

Tableau associatif et objet en JavaScript

Dans mon script il y a un besoin de créer une table de hachage, et j'ai cherché dans google pour cela. La plupart des gens recommandent l'objet JavaScript à cette fin. Le problème est que certaines des clés dans la table de hachage ont un "." en eux. Je suis capable de créer ces clés facilement avec les tableaux associatifs.

Je ne comprends pas pourquoi les tableaux associatifs sont mauvais. La première chose qui est mentionnée sur les sites que j'ai consultés est la propriété de longueur.

Je viens du milieu Perl, où j'ai utilisé des hachages. Les utilisations les plus courantes étaient de récupérer la valeur d'une clé, de vérifier si une clé existe, de supprimer une paire clé-valeur et d'ajouter une paire clé-valeur. Si ce sont là mes utilisations courantes, puis-je utiliser sans risque un tableau associatif ?

2 votes

Quel est ce réseau d'associés dont vous parlez ?

6 votes

Attention, plusieurs des réponses ci-dessous négligent de mentionner le problème des clés qui entrent en collision avec les méthodes intégrées : voir devthought.com/2012/01/18/un-objet-n'est-pas-un-hash

100voto

Justin Niessner Points 144953

En JavaScript, les objets sont des tableaux associatifs... il n'existe pas de concepts distincts pour eux. Vous pouvez également utiliser sans risque '.' dans le nom d'une clé, mais vous ne pouvez accéder à la valeur qu'en utilisant la notation entre parenthèses :

var foo = {}
foo['bar'] = 'test';
foo['baz.bin'] = 'value';

alert(foo.bar); // Shows 'test'
alert(foo['baz.bin']); // Shows 'value'

Si vous les utilisez déjà et qu'ils fonctionnent, vous êtes en sécurité.

11 votes

Notez que contrairement aux tableaux associés de PHP, les propriétés des objets ne sont pas triées, c'est-à-dire que vous ne pouvez pas compter sur leur ordre.

1 votes

Je ne pense pas que vous puissiez généraliser les objets comme des tableaux associatifs, principalement parce que les objets n'auront pas les méthodes que les tableaux associatifs ont implémentées. (Exemple : map , reduce , filter etc.)

0 votes

@hlin117 - Les tableaux associatifs (objets) ne disposent pas non plus de ces méthodes. Seuls les tableaux ordinaires ont ces méthodes.

33voto

Esailija Points 74052

En JavaScript, un objet et un tableau sont à peu près la même chose, un tableau disposant d'un peu de fonctionnalité magique (mise à jour automatique de la propriété length et autres) et de méthodes prototypes adaptées aux tableaux. Il est également beaucoup plus facile de construire un objet que d'utiliser un tableau associatif :

var obj = {"my.key": "myValue"};

vs.

var obj = [];
obj["my.key"] = "myValue";

Par conséquent, n'utilisez jamais l'objet tableau pour cela, mais simplement l'objet normal.

Certaines fonctionnalités :

var obj = {}; // Initialized empty object

Supprime une paire clé-valeur :

delete obj[key];

Vérifier si une clé existe :

key in obj;

Obtenir la valeur de la clé :

obj[key];

Ajouter une paire clé-valeur :

obj[key] = value;

1 votes

Et pour obtenir la taille d'un objet ?

1 votes

@realtebo il n'y a pas de syntaxe de première classe pour cela, vous pouvez créer une fonction pour cela si vous en avez besoin

2 votes

La partie de cette réponse concernant le fait de ne pas utiliser un tableau comme tableau associatif parce que cela nécessite deux lignes de code au lieu d'une est assez trompeuse. Cette construction ne remplit pas l'élément cible, elle définit une propriété du tableau, exactement comme décrit dans le post au même moment par @Dominic Goulet et NullUserException, qui est la réponse correcte. La seule raison pour laquelle il se comporte comme un tableau associatif (vous pouvez référencer obj["my.key"]) est que les propriétés du tableau sont un objet, et les objets sont aussi proches que possible des tableaux associatifs en Javascript.

18voto

Dominic Goulet Points 4964

Parce qu'il n'y a rien de tel que intégré tableaux associatifs en JavaScript. C'est pourquoi c'est mauvais.

En fait, quand vous utilisez quelque chose comme :

theArray["a"] = "Hello, World!";

Il crée simplement un propriété appelé "a" et a fixé sa valeur à "Hello, World !". C'est pourquoi la longueur est toujours 0, et pourquoi la sortie de alert(theArray) est vide.

0 votes

Bien sûr, il y a une telle chose comme un tableau associatif en javascript. Il n'y a simplement pas de intégré concept de tableau associatif. Par exemple, la fermeture possède un tableau associatif : docs.closure-library.googlecode.com/git/

0 votes

@JasonBaker L'OP faisait référence à javascript (voir tag), pas aux librairies google. Bien sûr, vous pouvez faire tout ce que vous voulez en javascript, et comme vous l'avez dit, il n'y a rien de tel que les librairies google. intégré tableaux associatifs en javascript. Je pensais que c'était évident, mais je vais mettre à jour la réponse.

9voto

jAndy Points 93076

En fait, un "tableau associatif" est à peu près la même chose qu'un "objet de type tableau" dans ECMAScript. Même les tableaux sont des objets en ECMAScript, à l'exception des clés numériques (qui sont toujours des chaînes de caractères en arrière-plan) et de l'attribut .length ainsi que certaines méthodes héritées de Array.prototype .

Ainsi, un hachage Perl et un objet ECMAScript se comportent de manière similaire. Vous ne savez peut-être pas que vous pouvez accéder aux propriétés d'un objet non seulement par le biais d'un point, mais aussi avec des parenthèses et des chaînes de caractères, par exemple

var myObj = { foo: 42 };

myObj.foo; // 42
myObj['foo']; // 42

Sachant cela, vous pouvez également utiliser des clés avec .

var myObj = { };
myObj['hello.foo.world'] = 42;

Bien entendu, vous ne pouvez accéder à cette clé qu'avec la notation entre crochets.

7voto

Marc B Points 195501

Vous pouvez utiliser . dans les noms de clés des objets JavaScript (AKA tableaux associatifs) si vous le souhaitez ; ils sont acceptés sans problème. L'inconvénient mineur est que vous ne pouvez pas utiliser les notations de raccourci avec les clés en pointillés, par ex.

var x = {};
x['hello'] = 'there';
alert(x.hello);

est parfaitement acceptable et fera apparaître une alerte avec le mot "there". Mais si vous utilisez un nom en pointillés :

var x = {};
x['this.is'] = 'sparta';
alert(x.this.is);

échouera, car JavaScript cherchera un attribut nommé this dans l'objet x, qui n'existe pas. Il n'y a que l'objet this.is attribut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X