web-dev-qa-db-ja.com

キーがすべて文字列であるときにES6 Mapを使用する上で何かポイントはありますか?

プレーンオブジェクトキーは文字列である必要がありますが、Mapは任意のタイプのキーを持つことができます。

しかし、実際にはこれを使用することはほとんどありません。ほぼすべての場合で、とにかく文字列をキーとして使用しています。そして、おそらくnew Map(){}よりも低速です。では、プレーンオブジェクトの代わりにMapを使用する方がよい理由は他にありますか?

40
callum

ランタイムデータ(キャッシュなど)を格納するためにプレーンオブジェクト(_{}_)よりもMapsを使用する方がよい理由はいくつかあります。

  1. _.size_プロパティは、このマップに存在するエントリの数を知らせます。
  2. さまざまなユーティリティメソッド-.clear().forEach()など。
  3. 彼らはデフォルトで私にイテレータを提供します!

関数の引数の受け渡し、設定の保存など、その他の場合はすべて、プレーンオブジェクトを使用して記述されます。

また、覚えておいてください:コードを早く最適化しようとしないでください。プロジェクトでパフォーマンスの問題が発生していない限り、プレーンオブジェクトとマップのベンチマークを行うのに時間を無駄にしないでください。

47
gustavohenke

これについてはよくわかりませんが、パフォーマンスがマップを使用する理由ではないと思います。この更新されたjsperfページを見てください。

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

(少なくとも文字列を扱う場合)オブジェクトは基本的な設定と取得のマップよりもはるかに高速です。

編集:この回答は現在古く、間違っています。以下のコメントストリームをご覧ください。

4
starlogodaniel

他の回答では、オブジェクトとMapsの最後の違いについては触れていません。

Mapオブジェクトはキーと値のペアを保持し、はキーの元の挿入順序を記憶します

したがって、それを反復すると、Mapオブジェクトは挿入順にキーを返します。

引用 [〜#〜] mdn [〜#〜]emphasismine


これが、最近のプロジェクトで初めてMapを使用することにした主な理由でした。 <table>に表示する必要がある通常のオブジェクトがあり、各プロパティは特定の行にあります。

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

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

目的のキーの順序に従ってオブジェクトをMapに変換する関数を作成しました。

注:この関数は、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;
}

次に、マップを目的の順序で反復できます。

let productMap = objectToMap( product, productPropertyOrder );

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

もちろん、これは少し工夫されています。プロセスでMapを作成せずにプロパティの順序を反復するときに表示することもできるからです。

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

しかし、そのようなオブジェクトの配列があり、それらを多くの場所に表示する場合は、最初にそれらすべてをマップに変換することは理にかなっています。

2
WD40