JavaScript - как копировать массив глубоко и неглубоко

JavaScript
JavaScript - как копировать массив глубоко и неглубоко

Я столкнулся с проблемой в последние два дня, как скопировать массив, поэтому я нашел много решений из разных мест. Он разбирается, чтобы облегчить ваше дальнейшее изучение:

содержание

  • Неглубокий массив копий
  • глубокий массив копий
    • 1. Используйте назначение обхода массива
      • принцип
      • Код
    • 2. Вернуть новый метод массива
      • 2.1 Использование метода среза
        • принцип
        • Код
      • 2.2 Использование метода отображения массива
      • 2.3 Использование метода concat
    • 3. Синтаксис ES6 реализует глубокую копию
    • 4. Метод копирования цепочки прототипов с for-in
    • 5. Копирование многомерных массивов

Неглубокий массив копий

Прежде всего, первый массив копирования, о котором мы все думаем, — это определение массива, который прямо равен:

  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 семь семь