嵌套对象相互覆盖

Nested objects overwriting each other

我对在我看来相当简单的数据结构有一些疑问。我有一个名为 mylist 的对象,其中包含 1. 一个嵌套的空 {} 和 2. 一个将对象添加到 (1) 中的函数。请考虑以下代码:

var object1 = {name: "Object_1"}
var object2 = {name: "Object_2"}
var mylist = {
    list: {},
    add: function(item, val){
        this.list[item] = val
    }
}
mylist.add(object1,5)
mylist.add(object2,10)
console.log(mylist)

现在,我希望输出为

{ list: { object1: 5, object2: 10 }, add: [Function] }

但我得到的是:

{ list: { '[object Object]': 10 }, add: [Function] }

由于某种原因,列表中以前的对象被覆盖。似乎也发生了某种字符串转换(由于引号),但我不确定为什么。为什么我没有得到我期望的输出?有人有这方面的好资源吗?

非常感谢。 莫里茨

问题是当您将 属性 添加到 this.list[item] 这样的对象时 JavaScript 使用 toString()(JavaScript 属性有一个字符串键)。

现在当 运行 toString()object1object2 上时,结果是 [Object object]。因此,当第一个对象添加到 list 时,它的键变为 [Object object]。添加第二个对象时,它也将具有相同的键 [Object object],因此将覆盖前一个。

因此,要使您的代码正常工作,只需将 .name 添加到 item

var object1 = {name: "Object_1"};
var object2 = {name: "Object_2"};
var mylist = {
    list: {},
    add: function(item, val){
        this.list[item.name] = val;
    }
}
mylist.add(object1,5);
mylist.add(object2,10);
console.log(mylist.list);

这是因为您传递的是一个对象而不是字符串,所以每当您这样做时:

mylist.add(object1,5);

而不是传递对象 object1,您应该传递一个字符串:

mylist.add(object1.name,5);

这将 return:

{ list: { "Object_1": 5 }, add: [Function] }

否则,如果您不发送字符串,无论您传递什么都会被转换成字符串