2013-11-08 3 views
0

Я извлекаю некоторые причудливые данные из контроллера MVC и присваиваю его глобальной переменной «data_Visits». Затем, позже в партии, мне нужно многократно работать с исходными данными в «data_Visits».Сбой массива клонов

Чтобы не изменять значения в «data_Visits», я думал клонировать его, а затем работать с клоном. Тем не менее, следующий, кажется, изменить значения в «data_Visits»:

var data = data_Visits.slice(0); 

data.forEach(function (d) { 
    d.date = new Date(ToJavaScriptDate(d.date)); 
    d.result1 = +d.result1; 
    d.result2 = +d.result2; 
}); 

кто-нибудь случится знать ПОЧЕМУ?

ответ

1

Потому что вы создаете клон массива ссылок. Вам нужно клонировать каждую запись массива специально, в противном случае оба массива будут содержать разные коллекции ссылок на одни и те же объекты.

То, что вам нужно сделать, называется глубокой копией.

Как только вы указали jquery тег - вот пример:

var data = $.extend(true, [], data_Visits); 

Ссылки:

PS: в качестве простого примера:

Это то, что вы основополагающие то есть:

var a = { foo: 'bar' }; 
var b = a; 

и хотя у вас есть 2 переменные - они относятся к одному и тому же объекту.

+0

Dooh! Звучит так чудесно логично. Deep Copy, спасибо, попробует это в одном экземпляре. – peter

+0

Ваш оригинальный код выглядит как чистый javascript. Вы используете библиотеку, такую ​​как jQuery? – Michael

+0

Да, я использую jQuery. zerkms, клонирование прошло успешно, но теперь я получаю сообщение об ошибке при попытке итерации через data.forEach() – peter

1

Я согласен, продлить - это то, что вы хотите. Если вы используете массив - вы можете использовать срез.

var d = {bob: 'yes'} 
var b = jQuery.extend({}, d); 

b.bob = 'no' 
// shows b modified, d is not 
console.log(b, d); 

здесь хороший referencde: How do I correctly clone a JavaScript object?

Смежные вопросы