Метод map для копии массива

32
14 января 2018, 06:33

Каким образом метод map примененный к копии массива меняет оригинал массива clients ?

const clients = [
  { name: 'Alex',town: 'Sitka',debt: false },
  { name: 'Bob',town: 'Phoenix',debt: false },
  { name: 'Pol',town: 'LosAngeles',debt: true },
  { name: 'Roy',town: 'Buckeye',debt: false },
  { name: 'Brad',town: 'Dallas',debt: false },
  { name: 'Leny',town: 'Charlotte',debt: true },
  { name: 'Peny',town: 'Hibbing',debt: false },
]
const clientsCopy1 = clients.slice();// делаем копию массива clients;
const clientsCopy2 = [...clientsCopy1]; // делаем копию массива clientsCopy1 
const clientsCopy3 = clientsCopy2.map(i => { // перебираем вторую копию 
методом map
  i.name = i.name.toUpperCase()
  return i;
})
console.log(clients); // исходный массив тоже изменился!
Использование других способов копирования дает тот-же результат.
Такое поведение только с методом map. 
При модификации копий массивов другими способами, исходный массив остается 
без изменений.
Answer 1

.slice не копирует объекты внутри массива. Он копирует размер массива и ссылки на объекты которые лежат в массиве.

Чтобы сделать полную копию надо превратить в JSON и распарсить обратно. Это самый быстрый способ, но он не позволяет сохранить информацию о классах (однако, вам тут это и не надо).

const clientsCopy1 = JSON.parse(JSON.stringify(clients));
READ ALSO
Parallax scroll - картинка выходит за границы блока при масштабировании

Parallax scroll - картинка выходит за границы блока при масштабировании

День добрый! Столкнулись с проблемой, с которой не получается справиться самостоятельноНа данный момент, в некоторых блоках при прокрутке...

60
Как обнаружить, что клавиша не нажата

Как обнаружить, что клавиша не нажата

Нужно проверить по keyCode, нажата ли клавиша в данный момент, не используя keyupЯ не прошу готового кода, но даже не представляю, в каком направлении...

18
Помогите разбить строчку с помощью split и обработать в JS скрипте

Помогите разбить строчку с помощью split и обработать в JS скрипте

Через AJAX вызывается PHP файл, который возвращает мне числа, разделенные через запятуюДалее мне нужно разбить их на массив и обработать

17
Разобрать массив и взять значения

Разобрать массив и взять значения

Помогите справиться с массивом

15