嵌套对象互相覆盖

时间:2015-01-11 00:59:50

标签: javascript object nested

我在一个相当简单的数据结构中遇到了一些问题。我有一个名为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},添加:[功能]}

但我得到的是:

  

{list:{' [object Object]':10},添加:[功能]}

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

提前多多感谢。 Maurits的

2 个答案:

答案 0 :(得分:1)

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

mylist.add(object1,5);

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

mylist.add(object1.name,5);

这将返回:

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

否则,如果您不发送任何传递的字符串将被转换为字符串

答案 1 :(得分:0)

问题是当你向this.list[item]这样的对象添加一个属性时,JavaScript使用toString()隐式地将属性转换为String(JavaScript属性有一个字符串键)。

现在,在toString()object1上运行object2时,结果为[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);