Cartes vs Objets dans l'ES6, Quand les utiliser?

Réf: cartes MDN

utiliser des cartes sur des objets lorsque les clés sont inconnues jusqu'à l'exécution, et lorsque toutes les touches sont du même type et de toutes les valeurs sont du même type.

utiliser des objets lorsqu'il y a une logique qui fonctionne sur des éléments individuels.

Question:

Ce qui est un exemple de l'utilisation de Cartes sur les objets? en particulier, "quand les touches sont inconnues jusqu'à 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));
67
demandé sur Matthew Harwood 2015-09-16 08:02:54

5 réponses

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

je pense que vous avez déjà donné un bon exemple: vous avez au moins besoin d'utiliser Map s lorsque vous utilisez des objets (y compris des objets de fonction) comme clés.

en particulier, "quand les touches sont inconnues jusqu'à exécution?"

Chaque fois qu'ils ne sont pas connus au moment de la compilation. En bref, vous devriez toujours utilisez un Map lorsque vous avez besoin d'un valeur de la clé collection . Un bon indicateur que vous avez besoin d'une collection est quand vous ajoutez et supprimez des valeurs dynamiquement de la collection, et surtout quand vous ne connaissez pas ces valeurs à l'avance (par exemple, elles sont lues à partir d'une base de données, entrées par l'utilisateur, etc).

en revanche, vous devriez utiliser des objets quand vous savez qui et combien de propriétés l'objet a tout en écrivant le code - lorsque leur forme est statique. Comme @Felix l'a dit: quand vous avez besoin d'un record . Un bon indicateur pour avoir le champs de différents types, et quand vous n'avez pas besoin d'utiliser la notation crochets (ou de s'attendre à un nombre limité de noms de propriété).

38
répondu Bergi 2015-09-16 12:01:28

je pense qu'avec Map de ES2015, il ne reste que deux raisons pour utiliser des objets simples:

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

  • si vous n'avez qu'une seule valeur et certaines fonctions qui devraient être associés explicitement (comme Promise - qui est un proxy pour une valeur d'avenir - et then / catch )
  • si vous avez une structure de données de type structure / enregistrement avec un ensemble statique de propriétés connu au " temps de compilation "(habituellement les structures/enregistrements ne sont pas itérables)

Dans tous les autres cas, vous pourriez envisager d'utiliser Map , parce que il préserve l'ordre des propriétés et sépare le programme (toutes les propriétés attribuées à l'objet Map ) du niveau de données (toutes les entrées dans le Map lui-même).

Quels sont les inconvénients de Map ?

  • vous perdez la concision de l'objet de la syntaxe littérale
  • vous avez besoin de remplaçants personnalisés pour JSON.stringyfy
  • vous perdez la déstructuration, qui est plus utile avec les structures de données statiques quoi qu'il en soit
20
répondu ftor 2018-04-23 16:42:33

utilise des cartes sur des objets lorsque les clés sont inconnues jusqu'à l'heure d'exécution, et 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 mal. Je dois dire que les gens trouvent de plus en plus de contenu erroné et/ou discutable sur MDN ces jours-ci.

rien dans cette phrase n'est correct. La principale raison d'utiliser des cartes est quand vous voulez objet-valorisé touches. L'idée que les valeurs doivent être du même type est absurde--bien qu'ils pourraient être, bien sûr. L'idée que l'on ne devrait pas utiliser d'objets lorsque les clés sont inconnues jusqu'à l'exécution est tout aussi absurde.

9
répondu 2015-09-16 09:47:24

cette question est une copie de mais jusqu'à ce qu'il est fermé, voici ma réponse de là-bas :

en plus des autres réponses, j'ai découvert que les cartes sont plus compliquées et verbeuses à utiliser que les objets.

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

c'est important, parce que le code plus court est plus rapide à lire, plus directement expressif, et mieux maintenu dans la tête du programmeur .

un autre aspect: parce que set() renvoie la carte, pas la valeur, il est impossible d'enchaîner les assignations.

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

déboguer des maps est aussi plus douloureux. Ci-dessous, vous ne pouvez pas réellement voir quelles clés sont dans la carte. Il faudrait écrire un code pour ça.

Good luck evaluating a Map Iterator

les objets peuvent être évalués par N'importe quel IDE:

WebStorm evaluating an object

2
répondu Dan Dascalescu 2017-05-23 12:10:10

une des différences entre Map et Object est:

Map peut utiliser le type de données complexes comme clé. comme ceci:

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

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

attention: Pour le type de données complexe, Si vous voulez obtenir la valeur, vous devez passer la même référence que la clé.

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

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

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
2
répondu novaline 2017-08-29 02:37:42