Как создать новый массив из другого массива, элементы которого представлены объектами? Доброго дня!
Как известно переменная, которой присвоено значение в виде объекта или массива, на самом деле хранит только ссылку в область памяти, в которой храниться этот массив или объект.
Так же известно, что метод 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 arr_elem = arr[i];
for (var key in arr_elem) {
new_arr_elem = arr_elem[key];
}
new_arr.push(new_arr_elem);
}
Не могу сообразить почему это не работает (точнее работает не так как я это себе представляю) - натолкните на правильную мысль.

21 Авг 2019 в 07:07
158 +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 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 654 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир