Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поведение массивов при копировании. (https://javascript.ru/forum/misc/50416-povedenie-massivov-pri-kopirovanii.html)

FoxTrix 25.09.2014 15:24

Поведение массивов при копировании.
 
Добрый день.
Возникла такая проблема: есть у меня некий массив с данными(default_arr), далее я его копирую
var arr = default_arr.concat();

далее происходят некоторые изменения с массивом arr, но почему-то эти изменения применяются и к default_arr, что мне совершенно не нужно.
Почему так происходит? И как я могу их "разделить"?

Tek 25.09.2014 15:39

Не вижу проблему
var default_arr = [1,2,3];
var arr = default_arr.concat();
arr.push(6);
console.log(arr);
console.log(default_arr);

ksa 25.09.2014 15:39

Цитата:

Сообщение от FoxTrix
происходят некоторые изменения с массивом arr, но почему-то эти изменения применяются и к default_arr

Бивас, тест! (с)

var a1=[1,2,3,4,5];
var a2=a1.concat();
a2[1]=10;
alert(a1);
alert(a2);

Первый массив не меняется! :)

FoxTrix 25.09.2014 15:42

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

ksa 25.09.2014 15:51

Цитата:

Сообщение от FoxTrix
ведь проблемы быть не должно

Ее и нет. Я это продемонстрировал...

Цитата:

Сообщение от FoxTrix
Есть момент о котором забыл упомянуть, массив трехмерный.

В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.

ksa 25.09.2014 15:54

Вот, что бывает с ДРУГИМ массивом. ;)

var a1=[1,2,[11,22,33],4,5];
var a2=a1.concat();
a2[1]=10;
alert(a1);
alert(a2);
a2[2][1]='Опа!';
alert(a1);
alert(a2);

FoxTrix 25.09.2014 15:57

Цитата:

Сообщение от ksa (Сообщение 332232)
Ее и нет. Я это продемонстрировал...

Её нет в примере. Когда я увидел эту ошибку, я и сам написал такой пример, и убедился что так быть не должно. Однако в коде я её наблюдаю. Если это поможет, могу выложить код, только он довольно объемный.

Цитата:

Сообщение от ksa (Сообщение 332232)
В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.

Знание терминологии это хорошо, но мне бы сейчас совет всё-таки по практической части....

ksa 25.09.2014 15:58

FoxTrix, вот

var a1=[1,2,[11,22,33],4,5];
var a2=a1.concat();
a2[2]=a1[2].concat();
a2[1]=10;
a2[2][1]='new';
alert(a1);
alert(a2);

"Первый" массив опять не поменялся!

ksa 25.09.2014 15:59

Цитата:

Сообщение от FoxTrix
могу выложить код, только он довольно объемный

Кому нужен чужой, большой код? :) Для демонстрации нужно уметь делать тестовые примеры.

FoxTrix 25.09.2014 16:01

Ок, сам найду решение, спасибо.

ksa 25.09.2014 16:01

Цитата:

Сообщение от FoxTrix
сам найду решение

Его тебе уже показали...
http://javascript.ru/forum/misc/5041...tml#post332236

FoxTrix 25.09.2014 16:05

Цитата:

Сообщение от ksa (Сообщение 332240)
Его тебе уже показали...

Спасибо, пропустил тот пост, спутал с тем что был выше.

FoxTrix 25.09.2014 16:32

Сделал вроде по аналогии, всё равно не работает =\
var default_arr = [
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст'], 'текст', 'текст']
];
var arr = default_arr.concat();

for(var i = 0; i < arr.length; i++) {
	arr[i][2] = default_arr[i][2].concat();
}

я всё верно понял?

ksa 25.09.2014 16:51

Цитата:

Сообщение от FoxTrix
всё равно не работает

У тебя ТРИ массива - их все три и нужно "клонировать".

var default_arr = [
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст','текст'], 'текст', 'текст'],
	['текст', 'текст', ['текст'], 'текст', 'текст']
];
var arr = default_arr.concat();
for(var i = 0; i < default_arr.length; i++) {
	arr[i] = default_arr[i].concat();
	arr[i][2] = default_arr[i][2].concat();
}
arr[1][2]='[new]';
alert(default_arr);
alert(arr);

ksa 25.09.2014 16:56

FoxTrix, вот еще статейка...
http://blog.eney-solutions.com.ua/co...avascript.html

Или вот...
http://webonrails.ru/post/1062/

FoxTrix 25.09.2014 16:58

Цитата:

Сообщение от ksa (Сообщение 332247)
У тебя ТРИ массива - их все три и нужно "клонировать".

Черт, и верно, про второй забыл =)
Спасибо, всё работает.

Аркадий Укупник 25.09.2014 19:36

В JS объекты за исключением примитивных(строк, чисел и булева типа) передаются по ссылке. Чтобы создать копию используй такую функцию function clone(o){return JSON.parse(JSON.stringify(o))}


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