Я столкнулся с проблемой в последние два дня, как скопировать массив, поэтому я нашел много решений из разных мест. Он разбирается, чтобы облегчить ваше дальнейшее изучение:
содержание
- Неглубокий массив копий
- глубокий массив копий
- 1. Используйте назначение обхода массива
- принцип
- Код
- 2. Вернуть новый метод массива
- 2.1 Использование метода среза
- принцип
- Код
- 2.2 Использование метода отображения массива
- 2.3 Использование метода concat
- 2.1 Использование метода среза
- 3. Синтаксис ES6 реализует глубокую копию
- 4. Метод копирования цепочки прототипов с for-in
- 5. Копирование многомерных массивов
- 1. Используйте назначение обхода массива
Неглубокий массив копий
Прежде всего, первый массив копирования, о котором мы все думаем, — это определение массива, который прямо равен:
var arr1 = [1,2,3];
var arr2 = arr1;
arr1[0] = 2;
console.log(arr1[0]); //2
Причина этого в том, что массив хранится вместе с кучей, а в стеке хранится адрес памяти, в котором фактически хранятся данные.Когда они равны, копируется только стек, в котором хранится адрес памяти, а два стека по-прежнему указывают на один и тот же адрес памяти одновременно. , поэтому при изменении значения одного изменяются и остальные, что называется мелкой копией.
Итак, как глубоко скопировать массив?
глубокий массив копий
1. Используйте назначение обхода массива
принцип
Это самый примитивный способ, заключающийся в переносе каждого значения в другой массив.
Код
var arr1 = [1,2,3];
var arr2 = [];
arr1.forEach(function(value,index){
arr2[index] = value;
})
console.log(arr2);
//这个时候改变arr1[0] = 3;那么输出arr2[0]还是等于1
2. Вернуть новый метод массива
2.1 Использование метода среза
принцип
Метод среза массива означает перехват массива, который также упоминался в предыдущем обзоре массива. slice(0) относится к перехвату массива от 0 до конца, а затем возврату нового массива, так что исходный массив не будет затронут.
Код
var arr1 = [1,2,3];
var arr2 = arr1.slice(0);
console.log(arr2); //[1,2,3]
//这个时候改变arr1[2] = 5,那么输出arr2[2]还是等于3
Следуя этому методу, расширили ли вы свой кругозор, чтобы увидеть, что еще возвращает новый массив?
2.2 Использование метода отображения массива
Используйте метод карты для обхода массива и возврата нового массива с неизмененными значениями.
var arr1 = [2,3,4];
var arr2 = arr1.map(function(value){
return value;
})
console.log(arr2); //[2,3,4]
2.3 Использование метода concat
Объедините массив, если соединение пустое, то оно также возвращает новый массив самого себя
var arr1 = [3,4,5];
var arr2 = arr1.concat();
console.log(arr2); //[3,4,5]
3. Синтаксис ES6 реализует глубокую копию
Оператор распространения ES6 реализует глубокую копию массива и в настоящее время является самым простым.
var arr = [1,2,3,4,5];
var [ ... arr2 ] = arr;
console.log(arr); //[1,2,3,4,5]
console.log(arr2); //[1,2,3,4,5]
4. Метод копирования цепочки прототипов с for-in
Этот метод не только копирует значение, но и копирует свойства.
var arr = [1,2,3,4,5];
arr.prototype = 5;
var arr2 = [];
for(var a in arr){
arr2[a] = arr[a];
}
console.log(arr2); // [1,2,3,4,5]
console.log(arr2.prototype); // 5
//之前的方法中新数组的prototype都是undefined
5. Копирование многомерных массивов
принцип
Преобразование многомерного массива в строку становится одномерным массивом.
var arr = [[1,2],3,4,[5,6]];
var arr1 = arr.toString().split(",")
var arr2 = arr.join().split(",")
console.log(arr1) //[1,2,3,4,5,6]
console.log(arr2) //[1,2,3,4,5,6]
Но как сохранить состояние этого двумерного массива? Требуется следующий код
Код
var arr = [[1,2],3,4,[5,6]];
var arr3 = JSON.parse(JSON.stringify(arr));
console.log(arr3) // [[1,2],3,4,[5,6]]
Если у вас есть новый метод, добро пожаловать, чтобы оставить сообщение? Будет обновляться время от времени, если я найду новые методы...
©burning_rhyme семь семь