Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Не понятное поведение при копирование массива (https://javascript.ru/forum/events/33983-ne-ponyatnoe-povedenie-pri-kopirovanie-massiva.html)

cyber 16.12.2012 23:17

Не понятное поведение при копирование массива
 
Вроде все просто и понятно, но что то не так и не как не могу понять что
console.log("Уровень " + Number + " загружен");

           if (!Levels[Number]) throw "Ошибка: Уровень не найден!";

           console.log("Рисование Уровня...");

           self.Current = Levels[Number];

           self.CurrentMatrix = self.Current.TextureMatrix.slice(0);// вот тут копируется массив 

           obj_draw = new Draw(self.Current, DrawCallback);// внутри функции  идет обращение к свойству CurrentMatrix

на прямую self.Current.TextureMatrix обращения к массиву нет ,обращение только к CurrentMatrix, но исходный массив все равно изменяется, уже час голову ломаю не могу понять почему...

cyber 16.12.2012 23:26

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

dmitriymar 17.12.2012 00:04

Цитата:

Сообщение от cyber
Number

а как насчёт использования зарезервированных слов?:)
http://javascript.ru/Number

Deff 17.12.2012 00:05

cyber,
Имхо связано со .slice()

Скопируй вначале в переменную,
var a = self.Current.TextureMatrix.slice(0);
self.CurrentMatrix = a;

cyber 17.12.2012 00:16

Deff, не помогло=(

cyber 17.12.2012 00:17

dmitriymar, спс поправил, но не один браузер не среагировал на эту ошибку...

nerv_ 17.12.2012 14:27

cyber, на понимаю, какой ответ ты хочешь получить, не показывая код функции-конструктора Draw.

BallsShaped 17.12.2012 14:49

Цитата:

Сообщение от cyber
не один браузер не среагировал на эту ошибку

Это не ошибка, а Number - не зарегистрированное слово.

У тебя в self.Current.TextureMatrix ведь тоже объекты, небось тоже массивы? Их тоже нужно клонировать.

BallsShaped 17.12.2012 14:55

Мне кажется удачным копировать объекты через Object.create:
var matrix = [[1]];
var matrix_copy = matrix.map(function ( x ){
  return Object.create( x );
});

matrix_copy[0][0] = 2;

alert( matrix[0][0], matrix_copy[0][0] );

nerv_ 17.12.2012 15:22

Цитата:

Сообщение от BallsShaped
а Number - не зарегистрированное слово

это глобальный конструктор
alert( Number );

в самом низу страницы http://sahart.ru/javascript/view_javaruk.php?id=2

Цитата:

Сообщение от BallsShaped
У тебя в self.Current.TextureMatrix ведь тоже объекты, небось тоже массивы?

все указывает на это :) (что объекты)

cyber 17.12.2012 17:12

Цитата:

Сообщение от BallsShaped
У тебя в self.Current.TextureMatrix ведь тоже объекты, небось тоже массивы? Их тоже нужно клонировать.

нет , в self.Current.TextureMatrix двумерный массив из чисел, проще говоря это матрица.

cyber 17.12.2012 22:17

Цитата:

Сообщение от cyber
нет , в self.Current.TextureMatrix двумерный массив из чисел, проще говоря это матрица.

после этого сообщения до меня дошло в чем проблема,но только щас руки дошли проверить, проблема в том что массив двумерный..
var foo = [[1,2,3],[1,2,3]];
var fii = foo.slice(0);
fii[0][0] = 22;
console.log(foo[0][0]);

У кого есть идеи как это красиво можно обойти без циклов?

cyber 17.12.2012 22:42

Дзен-трансгуманист,JSON ? :blink:

cyber 17.12.2012 22:55

Дзен-трансгуманист,превратить массив в строку , а потом обратно в массив , оригинально , спс.
П.с не сильно ли будет эта операция жрать ресурсы ?

cyber 18.12.2012 02:21

Дзен-трансгуманист,
Цитата:

Сообщение от Дзен-трансгуманист
Вообще-то я просто пошутил

это называется тролингом )
вот матрица, и да я забыл упомянуть про вложенный объект )
firstLvl.TextureMatrix = [
    [{top: 100, left: 200 }, 4],
    [{top: 140, left: 200 }, 2, 2, 2, 2, 2], [{ top: 160, left: 700 }, 5],
    [{top: 170, left: 200 }, 2, 2, 6, 2, 2],
    [{top: 220, left: 200 }, 2, 2, 2, 2, 2],
    [{top: 250, left: 200 }, 2, 1, 1, 1, 1],
    [{top: 280, left: 200 }, 2, 1, 1, 1, 1],
];

cyber 18.12.2012 10:31

Цитата:

Сообщение от Дзен-трансгуманист
Это не троллинг. Просто на этом форуме туго с юмором, sad but true.

бывает, не всегда можно отличить шутку от того что некоторые считают правильным))
Цитата:

Сообщение от Дзен-трансгуманист
OMG, переработай дизайн структур и не мучь нещасный джаваскрипт.

знаю , знаю, в массиве лучше хранить однотипные данные, но мне уже лень переделывать ))
И спс за copy , прикольно сделал)

nerv_ 18.12.2012 17:06

Цитата:

Сообщение от Дзен-трансгуманист
sad but true

могу ошибаться, но правильно так:
it's sadly but it's true
Надо тему в оффтопе создать "Английский: вопросы и ответы" :)

cyber 18.12.2012 17:37

nerv_, зачем?
я думаю большинство тут вполне понимает английский)

cyber 18.12.2012 17:43

Цитата:

Сообщение от Дзен-трансгуманист
Это не троллинг. Просто на этом форуме туго с юмором, sad but true.

предлагаю использовать тэг <humor>тут шутка</humor> :)

cyber 18.12.2012 18:09

Дзен-трансгуманист, я просто его допиливал как мог любыми методами, мне нужно было просто 17 курсачь сдавать)
back up нормального кода сделал как только разберусь с новым алгоритмом для шарика, займусь правкой кода, там много чего нужно привести в порядок, за месяц мой взгляд на этот код сильно изменился)

nerv_ 18.12.2012 18:15

Цитата:

Сообщение от cyber
я думаю большинство тут вполне понимает английский)

кто-то только учит :)

cyber 18.12.2012 18:18

nerv_, я тоже учу, но нечего сверх сложного тут и не проскакивало)
Цитата:

Сообщение от cyber
его допиливал как мог любыми методами

про любые методы , нужно было показывать преподу, а в чем проблема с массивом я еще тогда не понял и при поражение или победе после анимации в callback функцию я запихнул
window.location.reload();

знаю что это жестоко:lol:

cyber 18.12.2012 18:26

Дзен-трансгуманист,не ну половина кода там вполне нормальна (с моей точки зрения), все что писалось до декабря я оставлю)

nerv_ 18.12.2012 18:27

Цитата:

Сообщение от cyber
nerv_, я тоже учу, но нечего сверх сложного тут и не проскакивало)

ok. Как сказать по-английски "холодно"?

cyber 18.12.2012 18:30

nerv_, cold.

nerv_ 18.12.2012 18:33

Цитата:

Сообщение от cyber
cold

Цитата:

В русском языке существуют безличные предложения. То есть предложения, в которых присутствует только подлежащее или только сказуемое. В английском языке в предложении обязательно должны присутствовать оба главных члена предложения. Для выражения безличных предложений в английском языке используется оборот It is (это есть),
где It - подлежащее, а Is - сказуемое.

It is cold. - Холодно. (Это есть холодно)
It is late. - Поздно. (Это есть поздно)
http://www.study.ru/lessons/elementary1-3.html

cyber 18.12.2012 18:35

nerv_,ок, как будет "Я дома" ?

nerv_ 18.12.2012 18:37

cyber, я только учу) Могу предположить I'm home.

cyber 18.12.2012 18:42

nerv_, не правильно)
I'm at home
Цитата:

Используйте предлог at, говоря о зданиях, таких как, например, at the dentist’s, at the supermarket, at school, at the shop, etc. В тех случаях, когда говорите об этих местах как об определенных пунктах или ориентирах.

Источник: engblog.ru (Предлоги места в английском языке: at, in, on http://engblog.ru/prepositions-of-place)
и at work, at school, at home - пишутся без the

cyber 18.12.2012 18:52

Дзен-трансгуманист,
не я это правило придумал)

nerv_ 18.12.2012 19:16

Цитата:

Сообщение от Дзен-трансгуманист
What rule?

What is rule? Или я опять не прав? :) И еще лично мне видится ряд ошибок в предложении выше.

Начал создавать тему про инглиш в оффтопе, но потом осенило, и понял, почему ты оказался прав случае с металликой. Но, все-таки, мне кажется, ее надо создать :)

Dremlin 19.12.2012 04:45

Цитата:

Сообщение от cyber
на прямую self.Current.TextureMatrix обращения к массиву нет ,обращение только к CurrentMatrix, но исходный массив все равно изменяется, уже час голову ломаю не могу понять почему...

Моя интуиция подсказывает, что раз что то меняется, то это что то передано по ссылке... возможно причина в неверной организации наследования, что то со способом передачи параметров. Как то так. :)

cyber 19.12.2012 10:38

Dremlin, уже на писал ответ http://javascript.ru/forum/events/33...tml#post221922


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