Подтвердить что ты не робот

Копирование массива объектов в другой массив в javascript (Deep Copy)

Копирование массива объектов в другой массив в 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)

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

4b9b3361

Ответ 1

Try

var copy = JSON.parse(JSON.stringify(tags));

Ответ 3

Как упоминалось Здесь .slice(0) будет эффективно клонировать массив с элементами примитивного типа. Однако в вашем примере массив tags содержит анонимные объекты. Следовательно, любые изменения этих объектов в клонированном массиве отражаются в массиве tags.

@dangh ответьте выше derefences эти объекты элемента и создайте новые.

Вот еще один поток, рассматривающий аналогичную ситуацию

Ответ 4

Самый простой и оптимистичный способ сделать это в одной строке - использовать Underscore/Lodash

пусть a = _.map(b, _.clone)

Ответ 5

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

//$scope.MyData get from service
$scope.MyDataOriginal = $scope.MyData;

Ответ 6

Для этого я использую новый метод ECMAScript 6 Object.assign:

let oldObject = [1,3,5,"test"];
let newObject = Object.assign({}, oldObject)

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

также вы можете добавить и другие объекты, которые нужно скопировать:

let newObject = Object.assign({}, oldObject, o2, o3, ...)