我在一个相当简单的数据结构中遇到了一些问题。我有一个名为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的
答案 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);