2017-07-02 6 views
0

私はマップとしてオブジェクトをキーとして保存したいので、マッププレーンオブジェクトと同様のJavaScriptマップにアクセス

を使用しています。

私の質問は - プレーンオブジェクトにアクセスするのと同じ方法でマップにアクセスできますか?例えば

let m = new Map(); 
let obj = {foo:'bar'}; 
m[obj] = 'baz'; 
console.log(m[obj]); 

これがあると、正しく動作するようになっている、または私は地図の取得/設定メソッドを使用する必要がありますか?

get/setを使用する必要がある場合は、慎重に多くのコードをリファクタリングする必要があるためです。ここで

をリファクタリングする必要があるかもしれないコードの実際の生活の例です:

//(ブローカー後

function addWsLockKey(broker, ws, key) { 
    let v; 
    if (!(v = broker.wsLock[ws])) { 
    v = broker.wsLock[ws] = []; 
    } 
    if (v.indexOf(key) < 0) { 
    v.push(key); 
    } 
} 

//(broker.wsLockプレーン目的であった)の前に。 wsLockは

function addWsLockKey(broker, ws, key) { 
    let v; 
    if (!(v = broker.wsLock.get(ws))) { 
    v = []; 
    broker.wsLock.set(ws, v); 
    } 
    if (v.indexOf(key) < 0) { 
    v.push(key); 
    } 
} 

)Mapインスタンスであるセット()Cと同じライン上にVを設定するためのいくつかの方法がありますすべて?

+3

マップは他のJSオブジェクトとまったく同じですので、実際のマップを追加するのではなく、プロパティ["object Object]"を追加するだけです。エントリ。つまり、あなたはset/getを使う必要があります –

+0

私はコンソールであなたの例を試しました - うまくいくようです。 – Zac

+1

@ Zacのように、実際には実際のオブジェクトが表すプロパティには値が割り当てられず、Jaromanda Xのように '[object Object]'というプロパティに設定されます。 –

答えて

2

Mapオブジェクトの実際の値にアクセスする場合は、.get().set()またはさまざまなイテレータを使用する必要があります。などMap

var m = new Map(); 
m.set("test", "foo"); 
console.log(m.get("test")); // "foo" 

通常のプロパティへのアクセス:

m["test"] = "foo" 

はちょうどオブジェクトに対する定期的なプロパティを設定します - それは、実際のマップデータ構造には影響を与えません。

Mapデータ構造のメンバーとは別にMapオブジェクトプロパティにアクセスでき、2つを互いに混同しないように、このようにしたと思います。


さらに、通常のプロパティは文字列をプロパティ名として受け付けるため、オブジェクトのインデックスには通常のプロパティを使用できません。しかし、マップオブジェクトには.set().get()を使用するとその機能があります。


あなたはこれに対して「決定的な」回答を求めました。 ES6 specificationでは、.set()の内容を見て、[[MapData]]内部スロットで動作することを確認できます。これは、オブジェクトのプロパティとはまったく異なります。同様に、通常のプロパティアクセスを使用すると内部オブジェクト[[MapData]]にアクセスすることがどこにあるかは、その仕様のどこにもありません。したがって、通常のプロパティアクセスはオブジェクトの記述であることがわかります。 MapObjectで、Map仕様には、通常のプロパティアクセスが他のオブジェクトとは異なる動作をする必要があるとは何も記載されていません。実際には、Mapオブジェクトのすべてのメソッドに対して同じ動作を行わなければなりません。メソッド名と同じキーを使用してアイテムをMapに配置した場合は機能しません。したがって、あなたはこれで構成されていると証明します:

  1. 簡単なテストでは、プロパティアクセスがMap自体には何も書き込まれず、通常のプロパティのみが表示されます。
  2. この仕様では、オブジェクトとしてMapが記述されています。
  3. この仕様では、.get().set()が内部スロット[[MapData]]でどのように動作するかを説明しています。
  4. Mapオブジェクトのプロパティへのアクセスは、常にそれとは異なる動作をするという仕様には何もありません。
  5. プロパティアクセスがMapDataにアクセスした場合、メソッド名に矛盾するMapのキーを入力した場合、メソッドにアクセスできなくなります。その場合は混乱します。
+0

それは意味がある – Olegzandr

+0

ええ、私はマップを使用する必要がある理由は、私はキーとしてオブジェクトを使用することができます。情報をありがとう。 – Olegzandr

+0

しかし、私はこの種の利便性を求めています: – Olegzandr

関連する問題