Вход

Просмотр полной версии : Динамический объект в объекте


Аарон
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
Спасибо, очень помогли.
Пожскажите, пожалуйста, еще как перебрать все элементы массива 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
Циклом:

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
for(var j = 0, l = arr.length; j < l; j++)

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

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

Аарон
26.03.2014, 19:49
Спасибо!!!:dance:

Aetae
27.03.2014, 00:00
Хм, действительно на большом количестве итераций так есть выигрыш в скорости.
На самом деле минимальный, в отличие от выигрыша по сравнению с forEach.:) Так что скорее именно привычка и стиль.