#javascript #node.js
#javascript #node.js
Вопрос:
Я хочу создать объект, подобный этому:
var servers =
{
'local1' :
{
name: 'local1',
ip: '10.10.10.1'
},
'local2' :
{
name: 'local2',
ip: '10.10.10.2'
}
}
Это то, что я делаю
$.each( servers, function( key, server )
{
servers[server.name] = server;
});
Где servers — это массив объектов, подобных этим:
{
name: 'local1',
ip: '10.10.10.1'
}
Но приведенный выше код не присваивает объекту никаких ключей, поэтому ключи по умолчанию равны 0,1,2….
Комментарии:
1. Там нет ни намека на JSON, я удалил ссылки на него.
2. Как вы выполняете инициализацию
servers
?servers=[]
?servers={}
?3.
servers
это не массив. Это объект. Вы присваиваете объекты свойствам этого объекта, которые имеют имяserver.name
. В чем на самом деле ваша проблема? Что вы хотите сделать?4. @gAMBOOKa Почему вы используете jQuery на сервере -.-
5. @Raynos: Это интерфейсный скрипт
Ответ №1:
Одна потенциальная ошибка, которую я замечаю, заключается в том, что вы изменяете объект, над которым выполняете итерацию (серверы). Было бы неплохо создать новый пустой объект, который вы изменяете в цикле.
Также было бы полезно, если бы вы опубликовали некоторые примеры данных, чтобы мы могли запустить ваш код для себя.
Наконец, вы могли бы попробовать вставить туда ключевое слово debugger и пошагово выполнить код.
Ответ №2:
В Chrome, если вы запустите это:
a = [];
b = {n:"c",i:"1.2.3.4"};
a[b.n] = b;
alert (a["c"].i);
alert (a.c.i);
Вы получите строку «1.2.3.4», как и ожидалось. Но если вы измените пример как:
a = {};
b = {n:"c",i:"1.2.3.4"};
a[b.n] = b;
alert (a.c.i);
Вы снова получите тот же «1.2.3.4» :). Итак, ответ таков: ваш код присваивает свойства объектам, как вы просили. Единственное отличие заключается в том, что в первом примере вы использовали массив как объект, а во втором — простой объект.
Ответ №3:
AFAIK [] в javascript используется для индексации массивов, в то время как для доступа к свойствам объекта вы должны использовать точечную нотацию. Итак, ваш код должен быть:
$.each( servers, function( key, server )
{
var name = server.name;
eval("servers." name " = server");
});
Пожалуйста, попробуйте это, так как я это не тестирую.
Комментарии:
1. Это неверно. Вы можете и обычно должны использовать точечную нотацию для доступа к свойствам объекта. На самом деле, по сути, массив JavaScript — это объект с ключами 0, 1, 2, …
2. Неверно. В спецификации ecmascript указано, что обозначения в виде точек и квадратных скобок эквивалентны.