代码之家  ›  专栏  ›  技术社区  ›  mrid

JavaScript关联数组行为异常

  •  1
  • mrid  · 技术社区  · 8 年前

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

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

    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
    3 回复  |  直到 8 年前
        1
  •  7
  •   Suren Srapyan    8 年前

    当您使用 [] 使用object语法,并将对象作为属性名传递,属性名将是 string 给定表达式的表示,将在您的案例中 [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));
        2
  •  2
  •   Jonas Wilms    8 年前

    对象键仅为字符串!使用地图:

    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
  •  2
  •   Deepak Jha    8 年前

    这有一个问题,当你用关联数组样式写一个对象时,它只接受字符串。在您的情况下,它将覆盖自身,并且两个对象的答案始终相同,

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

    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