Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   проблема с элементами массива (https://javascript.ru/forum/misc/1693-problema-s-ehlementami-massiva.html)

Krinart 04.09.2008 01:05

проблема с элементами массива
 
добрый вечер... столкнулся я с проблемой, о которой вобщем даже писать смешно.... вот есть у меня такой участок кода


i= 0;

for(var iHero= 0; iHero<Heroes.length; iHero++)
{
for(iUnit= 0; iUnit<Heroes[iHero].heroUnit.length; iUnit++)
{
// создадим запись в таблице Units
Units[i]= new Array();
Units[i]= UnitsTable[Heroes[iHero].heroUnit[iUnit]];

// добавим id героя-хозяина
Units[i].heroID= iHero;


Units[i].coord= new Array(); // обяъвим массив координат клетки юнита
Units[i].coord.left= -1; // x- координата
Units[i].coord.top= -1; // y- координата


// вместо id заготовки юнита в таблицу Heroes впишем id созданного юнита

Heroes[iHero].heroUnit[iUnit]= i;
i++;
}
}



здесь из таблицы UnitsTable, где хранятся шаблоны юнитов, выбирается нужный и всталяется в таблицу Units, а id этой записи заносится в массив юнитов героя

и всё бы ничего, но есть одна загвоздка, измение какогонибудь поля в строке любого элемента, почемуто меняет все остальные, в которых поле unitID совпадает
напрмер есть такой участок кода

Units[1].coord.left= 220;

после этого поле coord.left становится равным 220 у всех элементов, у которых поле
unitID== Units[1].unitID

хотя unitID является по сути просто указателем на тип юнита, и никак не связана я идентификацией элементов

я часа два бился над этой проблемой, так и не смог решить её... надеюсь только на вашу помощь

ZoNT 04.09.2008 09:45

приведённый кусо кода верный. Ошибка где-то в другом месте.

sectus 04.09.2008 10:30

С объектами такой способ не прокатывает, если пишешь
obj=new my_obj();
то создается объект, после
obj2 = obj;
не создается новый объект, а просто создается новая ссылка на уже существующий объект. obj2 и obj по сути будут являться одним и тем же. Для получения желаемого результата нужно создавать копию объекта.

Krinart 05.09.2008 21:06

sectus
Спасибо огромное, все решил.. сделал вот такую вот простенькую функцию

function createCopy(obj)
{
if(obj instanceof Array)
{
newObj= new Array();

for(prop in obj)
{
newObj[prop]= createCopy(obj[prop])
}
return newObj;
}

return obj;
}

и теперь всё отлично работает!


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