#Articles
Кто попадался на этом? Поговорим о нюансах копирования массивов!Сначала обозначу задачу и укажу на проблему.
Есть массив с данными:const arr = [
{ full_name: 'Jason Statham', age: 56 },
{ full_name: 'Sharon Stone', age: 65 },
{ full_name: 'Dwayne Johnson', age: 51 },
]
Мне нужно получить человека с максимальным возрастом. Вот как я это делаю:
//Делаю копию массива
const sortedArr = arr;
//Сортирую свой новый массив, от большего к меньшему и получаю первый элемент.
const maxAge = sortedArr.sort((a,b) => b.age - a.age)[0].age
В итоге в консоли я получаю правильный ответ 65.console.log(maxAge)
НО, есть проблема, если выведу в консоль исходный массив arr, то он тоже отсортируется!
//Теперь исходный массив выглядит так
const arr = [
{ full_name: 'Sharon Stone', age: 65 },
{ full_name: 'Jason Statham', age: 56 },
{ full_name: 'Dwayne Johnson', age: 51 },
]
Хотя я делал же копию, в чем проблема и как это решить?=============
Проблема в том, что массивы являются ссылочными типами. Когда я создал первый массив
arr, то у него есть свой id, своя ссылка в памяти и просто так его значения не скопировать.
Т.е. когда я сделал так,
const sortedArr = arr, я записал в sortedArr ссылку (путь) к массиву arr, а
НЕ скопировал его значения. И когда я как-то меняю новый массив sortedArr, то данные по сути меняются только в arr, а мы просто по ссылке получаем измененные данные.
Как сделать полную (независимую) копию массива?1 способ, он же самый лучший и красивый - это использование оператора spread.
//Получаем макс. значение не затрагивая данные массива arr
const maxAge = [...arr].sort((a,b) => b.age - a.age)[0].age
2 способ - это использование оператора JSON.stringify().
//Получаем макс. значение не затрагивая данные массива arr
const maxAge = JSON.parse(JSON.stringify(arr)).sort((a,b) => b.age - a.age)[0].age
Спасибо всем, кто дочитал до конца
😎🖐@frontend_case