Назначение объектов ключам внутри объекта JavaScript

#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 указано, что обозначения в виде точек и квадратных скобок эквивалентны.