дублирование сплайсинга массивов JavaScript - PullRequest
2 голосов
/ 18 августа 2011

Я обнаружил странную ошибку в своем коде и не могу понять, почему это происходит.

У меня есть массив array1. Я дублирую массив1, делая массив2 равным массиву1. Затем я модифицирую array2, используя splice, чтобы добавить число. Array1 не следует трогать? Но оба выдают одно и то же изменение.

var array1 = [0,1,2,3,4,5];
var array2 = array1;
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

Я предполагаю, что я путаю назначение массива? Как правильно дублировать массивы без этого?

Приветствия

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Используйте array1.concat() для дублирования массива вместо передачи ссылки на array1:

var array1 = [0,1,2,3,4,5];
var array2 = array1.concat();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

array.concat() может объединять несколько массивов, но если вы передаете пустой аргумент, вы фактически объединяете массив без ничего: клонирование массива.

Обратите внимание, что любые элементы массива и объекта по-прежнему являются ссылками:

var a = [ [1], 2];
var b = a.concat();
b[0][0] = 0;
console.log(b); // gives 0,2
console.log(c); // gives 0,2 too!
0 голосов
/ 18 августа 2011

Если вы используете jQuery, вы можете сделать:

var array1 = [0,1,2,3,4,5];
var array2 = array1.slice();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

Проверьте этот пример .

0 голосов
/ 18 августа 2011

Массивы и объекты копируются по ссылке. Попробуйте это:

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
}

var array1 = [0,1,2,3,4,5];
var array2 = array1.clone();
...