2017-12-06 12 views
1

私は2つのオブジェクトを持っています。これらをキーとして連想配列に渡して値を代入すると、すべての値が間違って格納されます(最後のものを除く)。JavaScript連想配列が異常に動作します

誰でも私が間違っていることを教えてもらえますか?

var usrMrid = {name: "mrid"}; 
 
var usrXYZZ = {name: "xyzz"}; 
 

 
var comm = {}; 
 

 
comm[usrMrid] = "ONE"; 
 
comm[usrXYZZ] = "TWO"; 
 

 
console.log("usrMrid: " + comm[usrMrid]); // this gives TWO, when it should give ONE 
 
console.log("usrXYZZ: " + comm[usrXYZZ]); // this works fine

+1

オブジェクトキーは文字列のみです。そのために 'Map'を使用してください! –

+0

comm [usrMrid]、comm [usrXYZZ]は同じものに沸騰しますので、後で割り当てるものはすべて取得されます。 – HimanshuArora9419

答えて

7

あなたがオブジェクトと[]構文を使用して、プロパティ名としてオブジェクトを渡すと、プロパティ名があなたのケースになります与えられた式のstring表現になるだろう[object Object]。したがって、異なるオブジェクトを使用する場合は、同じプロパティーを名前[object Object]で作成し、前のプロパティーをオーバーライドします。

この例ではこれを見ることができます。ここではオブジェクトのプロパティを表示し、名前が[object Object]のプロパティが1つしかないことがわかります。その場合の

var usrMrid = {name: "mrid"}; 
 
var usrXYZZ = {name: "xyzz"}; 
 

 
var comm = {}; 
 

 
comm[usrMrid] = "ONE"; 
 
comm[usrXYZZ] = "TWO"; 
 

 
console.log(comm);
を使用でき

Map

var usrMrid = {name: "mrid"}; 
 
var usrXYZZ = {name: "xyzz"}; 
 

 
var comm = new Map([ 
 
    [usrMrid, "ONE"], 
 
    [usrXYZZ, "TWO"] 
 
]); 
 

 
console.log(comm.get(usrMrid));

+0

ああ、私はそれを得る、ありがとう!私はこの行動を避ける方法はありますか? – mrid

+0

この場合は 'Map'オブジェクトを使用できます –

2

オブジェクトのキーは、文字列のみです!そのために地図を使用します。

var usrMrid = {name: "mrid"}; 
var usrXYZZ = {name: "xyzz"}; 

const comm = new Map([ 
    [usrMrid,"ONE"], 
    [usrXYZZ, "TWO"] 
]); 

console.log(comm.get(usrMrid)); 

しかし、これはあまりにもシンボルのための本当に良いユースケースです:

const id = Symbol("id"); 

var usrMrid = { 
    name: "mrid", 
    [id]:"ONE" 
}; 
var usrXYZZ = { 
    name: "xyzz", 
    [id]:"TWO" 
}; 

console.log(usrMrid, usrMrid[id]); 
2

だけでなく、これが問題、あなたが連想配列形式でオブジェクトを書くとき、それは文字列のみを受け入れてい。あなたのケースでは、それ自身を上書きし、常に両方のオブジェクトに対して同じ答えを持ちます。

このようなものを書く必要があります。そうしないと、常に上書きされます。

var usrMrid = {name: "mrid"}; 
var usrXYZZ = {name: "xyzz"}; 

var comm = {}; 

comm[usrMrid.name] = "ONE"; 
comm[usrXYZZ.name] = "TWO"; 

console.log(comm);// this will print your object correctly. 
console.log(comm[usrMrid.name]);// this will print ONE 
console.log(comm["mrid"]);// this will also print ONE 
console.log(comm["xyzz"]); // This will print TWO 
console.log(comm[usrXYZZ.name]); // This will print TWO