【问题标题】:JavaScript associative array behaving strangelyJavaScript 关联数组行为异常
【发布时间】:2017-12-06 06:26:12
【问题描述】:

我有两个对象。当我将这些作为键传递给关联数组并分配一个值时,所有值都存储错误(最后一个除外)。

谁能告诉我我做错了什么??

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

【问题讨论】:

  • 对象键仅是字符串!为此使用Map
  • comm[usrMrid] , comm[usrXYZZ] 将归结为相同的东西,因此您以后分配的任何内容都会被采用。

标签: javascript arrays associative-array


【解决方案1】:

当您对对象使用[] 语法并将对象作为属性名称传递时,属性名称将是给定表达式的string 表示形式,在您的情况下为[object Object]。因此,当您使用不同的对象时,它们会创建名称为 [object Object] 的相同属性并覆盖之前的属性。

您可以在示例中看到它。这里我打印了对象的属性,你可以看到只有一个名为[object Object]的属性。

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));

【讨论】:

  • 哦,我明白了,谢谢!!有没有办法避免这种行为?
  • 这种情况下可以使用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]);

【讨论】:

    【解决方案3】:

    这有一个问题,当您以关联数组样式编写对象时,它只接受字符串。在你的情况下,它会覆盖自己,并且对两个对象总是有相同的答案,

    你需要写这样的东西,否则它总是会覆盖它。

    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
    

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多