Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамический объект в объекте (https://javascript.ru/forum/misc/46061-dinamicheskijj-obekt-v-obekte.html)

Аарон 26.03.2014 12:53

Динамический объект в объекте
 
Здраствуйте.
Подскажите, пожалуйста, как цикле задать свойство динамически созданного объекта, который лежит в другом объекте. :)
/*
* Пример свойства объекта в объекте 
* Нужно динамически создать такие же объекты: obj_1, obj_2 .... obj_10
*/
    var objs = {
        obj_100: {
            id: 100
        }
/*
* Создаём сначала сам объект.
* А вот свойство создать не удаётся
*/
    for (var i=1; i<=10; i++) {
        var name = "objs.obj_" + i;
        [name].id = i+1;    /* ТУТ ВСЯ ЗАГВОЗДКА */
    }
    alert(ships.ship_1.id);

Не понимаю как синтактически правильно написать.
Идея сделать это в два цикла меня посещала, но всё-таки хотелось бы понять, как это сделать именно одним циклом.

Спасибо за дельный ответ.

Aetae 26.03.2014 13:11

for (var i=1; i<=10; i++) {
    var name = "obj_" + i;
    objs[name] = {};
    objs[name].id = i+1;  
}

Vlasenko Fedor 26.03.2014 13:23

/*
       * Пример свойства объекта в объекте
       * Нужно динамически создать такие же объекты: obj_1, obj_2 .... obj_10
       */
      var objs = {
        obj_100: {
          id: 100
        }
      }
      /*
       * Создаём сначала сам объект.
       * А вот свойство создать не удаётся
       */
      for (var i = 1; i <= 10; i++) {
        var name = "objs.obj_" + i;
        objs[name] = objs[name] || {};
        objs[name].id = i + 1; /* ТУТ ВСЯ ЗАГВОЗДКА */
      }
      console.dir(objs);

Аарон 26.03.2014 15:55

Спасибо всё заработало
 
Спасибо, очень помогли.
Пожскажите, пожалуйста, еще как перебрать все элементы массива id, если этот массив находится в объекте obj, который в свою очередь находится в объекте objs.
objs[name].id =[ ];

jsnb 26.03.2014 16:31

Цитата:

Сообщение от Аарон (Сообщение 304495)
Спасибо, очень помогли.
Пожскажите, пожалуйста, еще как перебрать все элементы массива id, если этот массив находится в объекте obj, который в свою очередь находится в объекте objs.
objs[name].id =[ ];

Циклом:
var arr = objs[name].id;
for(var i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}

forEach:
var arr = objs[name].id;
arr.forEach(function(elem, i, arr) {
  console.log(elem);
});

Аарон 26.03.2014 16:56

Цитата:

Сообщение от jsnb (Сообщение 304499)
Циклом:
var arr = objs[name].id;
for(var i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}

forEach:
var arr = objs[name].id;
arr.forEach(function(elem, i, arr) {
  console.log(elem);
});

Мне кажется Вы не поняли вопроса.
objs = {
   obj_1: {
      id: [1, 2, 3]
   }
   obj_2: {
      id: [10, 20, 30]
   }
......

   obj_10: {
      id: [100, 200, 300]
   }
}

Есть объект, в нем другие объекты, а у каждого объекта есть свойство-массив.
Нужно циклом перебрать все элементы массивов во всех объектах.

jsnb 26.03.2014 17:08

for(var i = 1; i <= 10; i++) {
  if (!objs['obj_'+i]) continue;
  var arr = objs['obj_'+i].id;
  arr.forEach(function(elem, i, arr) {
    console.log(elem);
  });
}

Аарон 26.03.2014 18:28

Не моглы бы Вы через for написать вместо forEach?

Aetae 26.03.2014 18:32

for(var i = 1; i <= 10; i++) {
  if (!objs['obj_'+i]) continue;
  var arr = objs['obj_'+i].id;
  for(var j = 0, l = arr.length; j < l; j++)
    console.log(arr[j]);
  }
}

jsnb 26.03.2014 18:47

Цитата:

Сообщение от Aetae (Сообщение 304545)
for(var j = 0, l = arr.length; j < l; j++)

Кстати, а почему так условие записано? Это на что-то влияет или просто стиль?

UPDATE:
Хм, действительно на большом количестве итераций так есть выигрыш в скорости.


Часовой пояс GMT +3, время: 00:17.