2015-01-28 2 views
1

Нормально ли, что, когда я использую сплайсинг на temp, mainArray также изменяется?Временной массив сращивания будет изменять основной массив

console.log(mainArray); 

var temp = mainArray; 

temp.airfares.splice(index, 1); 
+1

Учитывая, что они ссылаться на такой же массив? Да. –

+0

Это не похоже на массив, если он имеет свойство '.airfares'. – Bergi

ответ

4

Это потому, что temp не является совершенно новый массив, просто ссылка на mainArray. Вам нужно сделать копию.

Чтобы сделать копию массива, используйте Array.prototype.slice(). Обратите внимание, что он не будет копировать каждый элемент, но скопирует сам массив (так что вы можете нажать или удалить элементы позже).

Например:

var data = [1, 2, 3, 4, 5]; 
 
document.getElementById("original").textContent = JSON.stringify(data); 
 

 
var ref = data; 
 
var copy = data.slice(); 
 

 
// Add some values to data, ref will change but copy won't 
 
data.push(6, 7, 8); 
 

 
document.getElementById("ref").textContent = JSON.stringify(ref); 
 
document.getElementById("copy").textContent = JSON.stringify(copy);
<pre id="original"></pre> 
 
<pre id="ref"></pre> 
 
<pre id="copy"></pre>

+0

См. Http://stackoverflow.com/a/15722443/227299 –

1

var temp = mainArray; установит temp в качестве ссылки на mainArray. Это означает, что оба они относятся к одному и тому же массиву. Поэтому, если вы изменяете temp, вы также изменяете mainArray.

1

Да, массивы JavaScript - это объекты, поэтому temp и mainArray являются ссылками на один и тот же базовый объект.

Вы хотите что-то вдоль линий этого:

console.log(mainArray); 
var temp = mainArray.slice(); 
temp.airfares.splice(index, 1); 
1

Массивы хранятся как ссылка не фактический массив хранится. Ссылка на него сохраняется (Поскольку массивы также объект)

Здесь вы можете использовать хак slice() или concat() метода, чтобы назначить его без ссылки

var temp = mainArray.slice(); 

или

var temp = [].concat(mainArray); 
Смежные вопросы