web-dev-qa-db-fra.com

Cartes vs objets dans ES6, Quand utiliser?

Ref: MDN Maps

Utilisez des cartes sur des objets lorsque les clés sont inconnues jusqu'au moment de l'exécution et lorsque toutes les clés sont du même type et toutes les valeurs sont du même type.

Utilisez des objets lorsqu'il existe une logique qui opère sur des éléments individuels.

Question:

Quel est un exemple d'application de l'utilisation de cartes sur des objets? en particulier, "quand les clés seraient-elles inconnues jusqu'au moment de l'exécution?"

var myMap = new Map();

var keyObj = {},
    keyFunc = function () { return 'hey'},
    keyString = "a string";

// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

console.log(myMap.get(keyFunc));
73
Matthew Harwood

Quel est un exemple d'application de l'utilisation de cartes sur des objets?

Je pense que vous avez déjà donné un bon exemple: vous devez au moins utiliser Maps lorsque vous utilisez des objets (y compris des objets Function) comme clés.

en particulier, "quand les clés seraient-elles inconnues jusqu'au moment de l'exécution?"

Chaque fois qu'ils ne sont pas connus au moment de la compilation. En bref, vous devriez toujours utiliser une Map lorsque vous avez besoin d'une clé-valeur collection . Un bon indicateur de la nécessité d'une collection consiste à ajouter et à supprimer des valeurs de la collection de manière dynamique, notamment lorsque vous ne les connaissez pas au préalable (par exemple, elles sont lues dans une base de données, entrées par l'utilisateur, etc.).

En revanche, vous devez utiliser des objets lorsque vous savez quelles sont les propriétés de l'objet et combien de celles-ci lors de l'écriture du code, et lorsque leur forme est statique. Comme @Felix l'a dit: quand vous avez besoin d'un record . Un bon indicateur de cette nécessité est lorsque les champs ont différents types et lorsque vous n’avez jamais besoin d’utiliser la notation entre crochets (ou d’attendre un ensemble limité de noms de propriété dans celle-ci).

42
Bergi

Je pense qu'avec Map d'ES2015, il ne reste plus que deux raisons d'utiliser des objets simples:

Quand l'ordre de propriété est-il sans importance?

  • si vous n'avez qu'une seule valeur et que certaines fonctions doivent y être associées explicitement (comme Promise - qui est un proxy pour une valeur future - et then/catch)
  • si vous avez une structure de données de type struct/record avec un ensemble statique de propriétés connu au moment de la compilation (généralement, les structures/enregistrements ne sont pas itérables)

Dans tous les autres cas, vous pouvez envisager d'utiliser Map, car il conserve l'ordre des propriétés et sépare le programme (toutes les propriétés affectées à l'objet Map) du niveau de données (toutes les entrées de la variable Map elle-même).

Quels sont les inconvénients de Map?

  • vous perdez la syntaxe littérale d'objet concise
  • vous avez besoin de remplacements personnalisés pour JSON.stringyfy
  • vous perdez la déstructuration, ce qui est de toute façon plus utile avec les structures de données statiques
24
user6445533

Utilisez des mappes sur des objets lorsque les clés sont inconnues jusqu'au moment de l'exécution, lorsque toutes les clés sont du même type et que toutes les valeurs sont du même type.

Je ne sais pas pourquoi quelqu'un écrirait quelque chose de si manifestement faux. Je dois dire que de nos jours, les gens trouvent de plus en plus de contenu faux et/ou discutable sur MDN.

Rien dans cette phrase n'est correct. La principale raison d'utiliser des cartes est lorsque vous souhaitez des clés à valeur d'objet. L'idée que les valeurs doivent être du même type est absurde - bien qu'elles puissent l'être, bien sûr. L'idée de ne pas utiliser d'objets lorsque les clés sont inconnues jusqu'au moment de l'exécution est également absurde.

9
user663031

Une des différences entre Map et Object est la suivante:

Map peut utiliser un type de données complexe comme clé. comme ça:

const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);

m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'

surveillez: Pour les types de données complexes, si vous voulez obtenir la valeur, vous devez transmettre la même référence que la clé.

Object, il n'accepte que le type de données simple (number, string) comme clé.

const a = {};
a[document.body] = 'stackoverflow';

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
3
slideshowp2

Cette question est une copie de mais jusqu'à ce qu'elle soit fermée, voici ma réponse de là-bas :

En plus des autres réponses, j'ai constaté que les cartes sont plus difficiles à manier et plus compliquées à utiliser que les objets.

obj[key] += x
// vs.
map.set(map.get(key) + x)

Ceci est important car un code plus court est plus rapide à lire, plus directement expressif et mieux gardé dans la tête du programmeur .

Un autre aspect: parce que set () renvoie la carte, pas la valeur, il est impossible de chaîner les affectations.

foo = obj[key] = x;  // Does what you expect
foo = map.set(key, x)  // foo !== x; foo === map

Le débogage de cartes est également plus douloureux. En dessous, vous ne pouvez pas voir quelles clés sont sur la carte. Il faudrait écrire du code pour le faire.

 Good luck evaluating a Map Iterator

Les objets peuvent être évalués par n'importe quel IDE:

 WebStorm evaluating an object

2
Dan Dascalescu

Objects sont similaires à Maps dans la mesure où ils vous permettent de définir des clés, de récupérer ces valeurs, de supprimer des clés et de détecter si quelque chose est stocké dans une clé. Pour cette raison (et parce qu'il n'y avait pas d'alternative intégrée), Objects a été utilisé comme Maps par le passé; Cependant, il existe des différences importantes qui rendent préférable d'utiliser Map dans certains cas:

  • Les clés d'une Object sont Strings et Symbols, alors qu'elles peuvent être N'importe quelle valeur pour une Map, y compris les fonctions, les objets et toute primitive.
  • Les clés dans Map sont ordonnées alors que les clés ajoutées à object ne le sont pas. Ainsi, En itérant dessus, un objet Map renvoie les clés dans l’ordre de Insertion.
  • Vous pouvez facilement obtenir la taille de Map avec la propriété size, tandis que le nombre de propriétés dans Object doit être déterminé manuellement.
  • Un Map est un itératif et peut donc être directement itéré, alors que Itérer sur un Object nécessite d'obtenir ses clés d'une manière ou d'une autre Et de les parcourir plusieurs fois.
  • Une Object a un prototype, il y a donc des clés par défaut dans la carte qui Pourraient entrer en collision avec vos clés si vous ne faites pas attention. À partir de ES5, ceci Peut être contourné en utilisant map = Object.create(null), mais c'est rarement le cas
  • Un Map peut donner de meilleurs résultats dans les scénarios impliquant l’ajout fréquent et la suppression de paires de clés.

MDN

0
John Kennedy