2015-01-11 10 views
0

У меня возникли проблемы с тем, что мне показалось бы довольно простой структурой данных. У меня есть объект с именем 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) 

Теперь, я бы ожидать, что выход будет

{список: {object1: 5, object2: 10}, добавьте: [Function]}

Но вместо того, что я получаю:

{список: { '[объект Object]': 10}, добавьте: [Function]}

По какой-либо причине предыдущие объекты в списке перезаписываются. Также, похоже, что-то вроде преобразования в строку происходит (из-за кавычек), но я не уверен, почему. Почему я не получаю ожидаемый результат? У кого-нибудь есть хороший ресурс?

Большое спасибо. Maurits

+0

'некоторая конверсия в строку, происходящую из-за' toString() '. – vjdhama

+0

Если ответы отвечают вам, пожалуйста, примите их, чтобы удалить их из списка без ответа. – vjdhama

ответ

0

Проблема заключалась в том, когда вы добавляете свойство к объекту, как this.list[item] JavaScript неявно преобразует свойство в строку, используя toString() (свойства 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); 
1

это потому, что вы передаете объект не является строкой, поэтому всякий раз, когда вы делаете это:

mylist.add(object1,5); 

вместо передачи объекта object1, вы должны передать строку:

mylist.add(object1.name,5); 

это вернет:

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

в противном случае, если вы не отправляете строку, все, что вы передадите, будет преобразовано в строку

Смежные вопросы