it-swarm.com.de

Gibt es einen Punkt bei der Verwendung von ES6 Map, wenn alle Schlüssel Zeichenfolgen sind?

Einfache Objektschlüssel müssen Zeichenfolgen sein, während ein Map Schlüssel eines beliebigen Typs haben kann.

Aber ich habe in der Praxis wenig Sinn dafür. In fast allen Fällen verwende ich ohnehin Strings als Schlüssel. Und vermutlich ist new Map() langsamer als {}. Gibt es also einen anderen Grund, warum es besser sein könnte, ein Map anstelle eines einfachen Objekts zu verwenden?

40
callum

Es gibt einige Gründe, warum ich Maps gegenüber einfachen Objekten ({}) Zum Speichern von Laufzeitdaten (Caches usw.) bevorzuge:

  1. Die Eigenschaft .size Gibt an, wie viele Einträge in dieser Map vorhanden sind.
  2. Die verschiedenen Dienstprogrammmethoden - .clear(), .forEach() usw.;
  3. Sie stellen mir standardmäßig Iteratoren zur Verfügung!

Jeder andere Fall, wie das Übergeben von Funktionsargumenten, das Speichern von Konfigurationen usw., wird mit einfachen Objekten geschrieben.

Denken Sie auch daran : Versuchen Sie nicht, Ihren Code zu früh zu optimieren. Verschwenden Sie keine Zeit mit Benchmarks für einfache Objekte im Vergleich zu Karten, es sei denn, Ihr Projekt weist Leistungsprobleme auf.

47
gustavohenke

Ich bin mir nicht sicher, aber ich denke, dass die Leistung KEIN Grund ist, Maps zu verwenden. Schauen Sie sich diese aktualisierte jsperf-Seite an:

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

Es sieht so aus, als ob (zumindest wenn es um Zeichenfolgen geht) Objekte viel schneller als Karten sind, um sie grundlegend festzulegen und abzurufen.

EDIT: Diese Antwort ist jetzt veraltet und falsch. Siehe Kommentar-Stream unten.

4
starlogodaniel

Die anderen Antworten erwähnen keinen letzten Unterschied zwischen Objekten und Maps:

Das Map -Objekt enthält Schlüssel-Wert-Paare und merkt sich die ursprüngliche Einfügereihenfolge der Schlüssel .

Wenn ein Map-Objekt darüber iteriert, gibt es die Schlüssel in der Reihenfolge des Einfügens zurück.

Zitat aus MDN , Hervorhebung meins


Dies war der Hauptgrund, warum ich mich entschied, Map zum ersten Mal in einem kürzlich durchgeführten Projekt zu verwenden. Ich hatte ein normales Objekt, das ich in einem <table> Anzeigen musste, wobei jede Eigenschaft in einer bestimmten Zeile stand.

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

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

Ich habe eine Funktion geschrieben, um ein Objekt gemäß einer gewünschten Schlüsselreihenfolge in ein Map umzuwandeln:

Hinweis: Diese Funktion verwirft alle Objekteigenschaften, die in order nicht gefunden wurden

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

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

    return map;
}

Dann könnte die Karte in der gewünschten Reihenfolge wiederholt werden:

let productMap = objectToMap( product, productPropertyOrder );

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

Dies ist natürlich etwas kompliziert, da man es genauso gut anzeigen kann, wenn man über die Eigenschaftsreihenfolge iteriert, ohne dabei ein Map zu erstellen:

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

Wenn Sie jedoch über eine Reihe solcher Objekte verfügen und diese an vielen Stellen anzeigen möchten, ist es zunächst sinnvoll, sie alle in Karten zu konvertieren.

2
WD40