80 votes

Objets vs tableaux en Javascript pour les paires clé/valeur

Disons que vous avez un très simple structure de données:

(personId, name)

...et vous souhaitez stocker un nombre dans une variable javascript. Comme je le vois, vous avez trois options:

// a single object
var people = {
    1 : 'Joe',
    3 : 'Sam',
    8 : 'Eve'
};

// or, an array of objects
var people = [
    { id: 1, name: 'Joe'},
    { id: 3, name: 'Sam'},
    { id: 8, name: 'Eve'}
];

// or, a combination of the two
var people = {
    1 : { id: 1, name: 'Joe'},
    3 : { id: 3, name: 'Sam'},
    8 : { id: 8, name: 'Eve'}
};

La deuxième ou la troisième option est évidemment la voie à suivre si vous avez (ou de s'attendre à ce que vous pourriez avoir) plus d'une "valeur" de la part de store (par exemple, en ajoutant à leur âge ou de quelque chose), donc, pour la clarté de l'exposé, nous supposerons qu'il n'y a jamais, jamais, jamais va être tout plus de valeurs de données nécessaires dans cette structure. Laquelle allez-vous choisir et pourquoi?


Edit: L'exemple montre maintenant la situation la plus courante: non-séquentielle id.

58voto

Daniel Lew Points 39063

Chaque solution a ses cas d'utilisation.

Je pense que la première solution est bonne si vous essayez de définir un one-to-one relation (comme une simple cartographie), surtout si vous avez besoin d'utiliser la clé comme une recherche de la clé.

La deuxième solution se sent le plus robuste pour moi, en général, et je serais probablement utiliser si je ne l'avais pas besoin d'une recherche rapide de la clé:

  • C'est l'auto-description, de sorte que vous n'avez pas avoir à dépendre de personne à l'aide de les gens de savoir que la clé est l'id de l'utilisateur.
  • Chaque objet est autonome, ce qui est mieux pour transmettre les données d'ailleurs, au lieu de deux paramètres (id, nom) vous venez de passer autour de personnes.
  • C'est un problème rare, mais parfois les valeurs de clé peut ne pas être valide pour utiliser comme clés. Par exemple, une fois, j'ai voulais la carte de la chaîne de conversions (par exemple, ":"">"), mais depuis ":" n'est-ce pas un nom de variable valide, j'ai eu à utiliser la deuxième méthode.
  • Il est facilement extensible, en cas quelque part le long de la ligne, vous devez ajouter plus de données pour certaines (ou toutes) des utilisateurs. (Désolé, je sais à propos de votre "pour la commodité du raisonnement", mais c'est un aspect important.)

La troisième serait bon si vous avez besoin de la recherche rapide de temps + quelques-uns des avantages énumérés ci-dessus (circuler les données, auto-descriptif). Toutefois, si vous n'avez pas besoin de la recherche rapide de temps, c'est beaucoup plus lourd. Aussi, de toute façon, vous courez le risque d'erreur si l'id de l'objet en quelque sorte varie en fonction de l'id de personnes.

7voto

derobert Points 26258

En fait, il y a une quatrième option:

var people = ['Joe', 'Sam', 'Eve'];

depuis vos valeurs arriver à être consécutives. (Bien sûr, vous aurez à ajouter/soustraire une --- ou tout simplement le mettre pas défini comme le premier élément).

Personnellement, j'irais avec votre (1) ou (3), parce que ceux qui sera le plus rapide pour rechercher quelqu'un par ID (O logn au pire). Si vous devez trouver l'id 3 (2), soit vous pouvez le regarder en indice (dans ce cas, ma (4) est ok) ou vous avez à la recherche - O(n).

Précisions: - je dire O(logn) est le pire, il pourrait être parce que, autant que je sache, et la mise en œuvre pourrait décider d'utiliser l'équilibre de l'arbre au lieu d'une table de hachage. Une table de hachage serait O(1), en supposant minimale de collisions.

Edit de nickf: depuis, j'ai changé l'exemple de l'OP, de sorte que cette réponse ne peut pas faire autant de sens. Des excuses.

Post-édition

Ok, de post-édition, je choisirais l'option (3). Il est extensible (facile d'ajouter de nouveaux attributs), dispose de rapides recherches, et peut être réitéré. Il vous permet également de passer de l'entrée de l'ID, si vous en avez besoin.

Option (1) serait utile si (a) vous avez besoin pour économiser de la mémoire; (b) vous n'aurez jamais à aller à partir de l'objet de l'identification; (c) vous n'aurez plus jamais d'étendre les données stockées (par exemple, vous ne pouvez pas ajouter de la personne du nom de famille)

L'Option (2) est bon si vous (a) la nécessité de préserver la commande; (b) à itérer tous les éléments; c) n'a pas besoin de chercher les éléments d'identification, sauf si elle est triée par id (vous pouvez faire une recherche binaire en O(logn). Remarque, bien sûr, si vous avez besoin de garder un tri puis vous aurez à payer un coût lors de l'insertion.

2voto

scaraveos Points 403

J'ai créé une petite bibliothèque pour gérer les paires clé-valeur.

https://github.com/scaraveos/keyval.js#readme

Il utilise

  • un objet pour stocker les clés, ce qui permet de rapidement supprimer et la valeur de récupération les opérations et les
  • une liste chaînée pour permettre très vite de la valeur de l'itération

Espérons que cela aide :)

2voto

karim79 Points 178055

En supposant que les données ne changera jamais, le premier (objet unique) de l'option est la meilleure.

La simplicité de la structure signifie qu'il est le plus rapide à analyser, et dans le cas de petits, rarement (ou jamais) modification des ensembles de données comme celle-ci, je ne peux qu'imaginer qu'il sera fréquemment exécutées - dans ce cas, un minimum de frais généraux est le chemin à parcourir.

0voto

Compte tenu de sa contrainte que vous n'aurez jamais le nom de la valeur, je choisirais la première option. C'est le plus propre, a le moins de frais généraux et de la manière la plus rapide regarder.

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