Ответ 1
Try
var copy = JSON.parse(JSON.stringify(tags));
Копирование массива объектов в другой массив в javascript с помощью slice (0) и concat() не работает.
Я попробовал следующее проверить, получаю ли я ожидаемое поведение глубокой копии, используя это. Но исходный массив также изменяется после внесения изменений в скопированный массив.
var tags = [];
for(var i=0; i<3; i++) {
tags.push({
sortOrder: i,
type: 'miss'
})
}
for(var tag in tags) {
if(tags[tag].sortOrder == 1) {
tags[tag].type = 'done'
}
}
console.dir(tags)
var copy = tags.slice(0)
console.dir(copy)
copy[0].type = 'test'
console.dir(tags)
var another = tags.concat()
another[0].type = 'miss'
console.dir(tags)
Как я могу сделать глубокую копию массива в другой, так что исходный массив не будет изменен, если я сделаю изменение в массиве копий.
Try
var copy = JSON.parse(JSON.stringify(tags));
Попробуйте выполнить
// Deep copy
var newArray = jQuery.extend(true, [], oldArray);
Подробнее об этом вопросе проверьте Каков наиболее эффективный способ глубокого клонирования объекта в JavaScript?
Как упоминалось Здесь .slice(0)
будет эффективно клонировать массив с элементами примитивного типа. Однако в вашем примере массив tags
содержит анонимные объекты. Следовательно, любые изменения этих объектов в клонированном массиве отражаются в массиве tags
.
@dangh ответьте выше derefences эти объекты элемента и создайте новые.
Вот еще один поток, рассматривающий аналогичную ситуацию
Самый простой и оптимистичный способ сделать это в одной строке - использовать Underscore/Lodash
пусть a = _.map(b, _.clone)
Такая же проблема со мной. У меня есть данные из службы и сохраняются в другой переменной. Когда я обновляю свой массив, скопированный массив также обновляется. старый код выглядит ниже
//$scope.MyData get from service
$scope.MyDataOriginal = $scope.MyData;
Для этого я использую новый метод ECMAScript 6 Object.assign:
let oldObject = [1,3,5,"test"];
let newObject = Object.assign({}, oldObject)
первым аргументом этого метода является массив, который нужно обновить, мы передаем пустой объект, потому что хотим иметь совершенно новый объект,
также вы можете добавить и другие объекты, которые нужно скопировать:
let newObject = Object.assign({}, oldObject, o2, o3, ...)