Как создать новый массив из другого массива, элементы которого представлены объектами? Доброго дня! Как известно переменная, которой присвоено значение в виде объекта или массива, на самом деле хранит только ссылку в область памяти, в которой храниться этот массив или объект. Так же известно, что метод 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); } Не могу сообразить почему это не работает (точнее работает не так как я это себе представляю) - натолкните на правильную мысль.
Почему при использовании метода slice() копирование массива, элементы которого представлены объектами, ссылается на одну область памяти? Это происходит из-за того, что метод slice() создает поверхностную копию массива, т.е. копируются только ссылки на объекты, а не объекты сами по себе. Поэтому при изменении свойств объекта в новом массиве, изменения отражаются и в исходном массиве.
Как в таком случае создать новую копию массива, элементы которого представляют собой объекты? Для создания глубокой копии массива (с копированием объектов, а не ссылок на них) можно воспользоваться методом JSON.stringify() и JSON.parse(). Вот пример:
Таким образом, при использовании JSON.stringify() мы создаем глубокую копию массива и его объектов, а затем с помощью JSON.parse() преобразуем обратно в массив объектов.
Ваш вариант с циклом не работает, так как вы перезаписываете значение new_arr_elem при каждой итерации цикла, а не создаете новый объект для каждого элемента массива.
Надеюсь, это поможет вам решить вашу проблему! Если у вас есть другие вопросы, не стесняйтесь задавать.
Здравствуйте! Давайте разберем по порядку.
Почему при использовании метода slice() копирование массива, элементы которого представлены объектами, ссылается на одну область памяти?
Это происходит из-за того, что метод slice() создает поверхностную копию массива, т.е. копируются только ссылки на объекты, а не объекты сами по себе. Поэтому при изменении свойств объекта в новом массиве, изменения отражаются и в исходном массиве.
Как в таком случае создать новую копию массива, элементы которого представляют собой объекты?
var arr = [ {x:1, y:1} ];Для создания глубокой копии массива (с копированием объектов, а не ссылок на них) можно воспользоваться методом JSON.stringify() и JSON.parse(). Вот пример:
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 при каждой итерации цикла, а не создаете новый объект для каждого элемента массива.
Надеюсь, это поможет вам решить вашу проблему! Если у вас есть другие вопросы, не стесняйтесь задавать.