web-dev-qa-db-fra.com

Est-il utile d'utiliser ES6 Map lorsque les clés sont toutes des chaînes?

Les clés d'objet simples doivent être des chaînes, tandis qu'un Map peut avoir des clés de n'importe quel type.

Mais j'ai peu d'utilité pour cela dans la pratique. Dans presque tous les cas, je me retrouve quand même à utiliser des chaînes comme clés. Et probablement new Map() est plus lent que {}. Y a-t-il une autre raison pour laquelle il serait préférable d'utiliser un Map au lieu d'un simple objet?

40
callum

Il y a quelques raisons pour lesquelles je préfère utiliser Maps plutôt que des objets simples ({}) Pour stocker des données d'exécution (caches, etc.):

  1. La propriété .size Me permet de savoir combien d'entrées existent dans cette carte;
  2. Les différentes méthodes utilitaires - .clear(), .forEach(), etc;
  3. Ils me fournissent des itérateurs par défaut!

Tous les autres cas, comme le passage d'arguments de fonction, le stockage de configurations, etc., sont tous écrits à l'aide d'objets simples.

N'oubliez pas non plus: N'essayez pas d'optimiser votre code trop tôt. Ne perdez pas votre temps à faire des benchmarks d'objet simple vs Maps, sauf si votre projet souffre de problèmes de performances.

47
gustavohenke

Je ne suis pas sûr de cela, mais je pense que les performances ne sont PAS une raison pour utiliser Maps. Jetez un œil à cette page jsperf mise à jour:

http://jsperf.com/es6-map-vs-object-properties/7

Il semble que (lorsqu'il s'agit au moins de chaînes) les objets soient beaucoup plus rapides que les cartes pour les réglages de base et l'obtention.

EDIT: cette réponse est désormais obsolète et erronée. Voir le flux de commentaires ci-dessous.

4
starlogodaniel

Les autres réponses ne mentionnent pas une dernière différence entre les objets et Maps:

L'objet Map contient des paires clé-valeur et se souvient de l'ordre d'insertion d'origine des clés .

Ainsi, lors de son itération, un objet Map renvoie les clés par ordre d'insertion.

Citation de MDN , accent le mien


C'est la principale raison pour laquelle j'ai décidé d'utiliser Map pour la première fois dans un projet récent. J'avais un objet normal que je devais afficher dans un <table>, chaque propriété se trouvant dans une ligne spécifique.

let productPropertyOrder = [ "name", "weight", "price", "stocked" ];

let product =
{
    name: "Lasagne",
    weight: "1kg",
    price: 10,
    stocked: true
}

J'ai écrit une fonction pour transformer un objet en Map selon un ordre de clé souhaité:

Remarque: cette fonction supprime toutes les propriétés des objets introuvables dans order

function objectToMap( obj, order )
{
    let map = new Map();

    for ( const key of order )
    {
        if ( obj.hasOwnProperty( key ) )
        {
            map.set( key, obj[ key ] );
        }
    }

    return map;
}

Ensuite, la carte peut être itérée dans l'ordre souhaité:

let productMap = objectToMap( product, productPropertyOrder );

for ( const value of productMap.values() )
{
    let cell = document.createElement( "td" );
    cell.innerText = value;
    row.appendChild( cell );
}

Bien sûr, c'est un peu artificiel car on pourrait tout aussi bien afficher lors de l'itération sur l'ordre des propriétés sans créer un Map dans le processus:

for ( const key of productPropertyOrder )
{
    if ( product.hasOwnProperty( key ) )
    {
        let value = product[ key ];
        // create cell
    }
}

Mais si vous avez un tableau de ces objets et que vous allez les afficher à de nombreux endroits, les convertir tous en cartes est tout d'abord logique.

2
WD40