Как создать новый массив из другого массива, элементы которого представлены объектами? Доброго дня!
Как известно переменная, которой присвоено значение в виде объекта или массива, на самом деле хранит только ссылку в область памяти, в которой храниться этот массив или объект.
Так же известно, что метод slice() для значения представленного в виде массива копирует часть этого массива (либо весь) в другую переменную, при этом переменные будут указывать на две разные области в памяти, т.е.a = [1,2,3];
b = a.slice();
b[0] = 2;
alert(a); // [1,2,3]
alert(b); // [2,2,3]
Но стоит поместить в массив элементы, представляющие собой объекты, как такой способ перестает работать.
Пример:a = [{x:1,y:1}];
b = a.slice();
b[0].x = 2;
alert(a); // [{x:2,y:1}]
alert(b); // [{x:2,y:1}]
Вопросы:
1. Почему так происходит?
2. Как в таком случае создать новую копию целевого массива, элементы которого представляют собой объекты?
Пробовал через цикл, таким образом:var arr = [ {x:1, y:1} ];
var new_arr = [];
var new_arr_elem = {};
for (var i=0; i

21 Авг 2019 в 07:07
191 +1
0
Ответы
1

Здравствуйте! Давайте разберем по порядку.

Почему при использовании метода slice() копирование массива, элементы которого представлены объектами, ссылается на одну область памяти?
Это происходит из-за того, что метод slice() создает поверхностную копию массива, т.е. копируются только ссылки на объекты, а не объекты сами по себе. Поэтому при изменении свойств объекта в новом массиве, изменения отражаются и в исходном массиве.

Как в таком случае создать новую копию массива, элементы которого представляют собой объекты?
Для создания глубокой копии массива (с копированием объектов, а не ссылок на них) можно воспользоваться методом JSON.stringify() и JSON.parse(). Вот пример:

var arr = [ {x:1, y:1} ];
var new_arr = JSON.parse(JSON.stringify(arr));
new_arr[0].x = 2;
console.log(arr); // [{x:1, y:1}]
console.log(new_arr); // [{x:2, y:1}]

Таким образом, при использовании JSON.stringify() мы создаем глубокую копию массива и его объектов, а затем с помощью JSON.parse() преобразуем обратно в массив объектов.

Ваш вариант с циклом не работает, так как вы перезаписываете значение new_arr_elem при каждой итерации цикла, а не создаете новый объект для каждого элемента массива.

Надеюсь, это поможет вам решить вашу проблему! Если у вас есть другие вопросы, не стесняйтесь задавать.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир