2016-10-10 4 views
5

Я некоторое время занимался серфингом здесь и до сих пор не нашел ответа, который сработал для меня.Как глубоко скопировать пользовательский объект в JavaScript?

Есть ли способ глубоко скопировать не-простой объект в JS?

Я пробовал jQuery.extend(true, {}, this), но он только клонировал некоторые из них, остальное оставалось ссылкой на другой объект.

+1

_ «но только клонировать некоторые из них, остальные остались в качестве ссылки на другой объект.» _ Вы можете включить объект на вопрос, создать stacksnippets продемонстрировать? – guest271314

+0

Всегда есть 'JSON.parse (JSON.stringify (...))' hack. –

+1

@AkshatMahajanЕсли это формат JSON, это прекрасно, ОП намекает, что он имеет функции. – epascarello

ответ

4

Вы можете использовать cloneDeep функцию lodash в - https://lodash.com/docs/4.16.4#cloneDeep

Пример (из документации)

var objects = [{ 'a': 1 }, { 'b': 2 }]; 

var deep = _.cloneDeep(objects); 
console.log(deep[0] === objects[0]); 
// => false 
7

Если объект не имеет каких-либо циклических ссылок или функции в качестве значений, вы можете использовать JSon stringify трюк :

let myCopy = JSON.parse(JSON.stringify(myObject)); 

Никаких библиотек не требуется и работает очень хорошо для большинства объектов.

+0

Будет ли эта копия работать в 'myObject'? – guest271314

+1

@ guest271314 Nope. Но почему вы добавляете функции в структуры данных? Функции должны быть как подпрограммы в разных местах. Это просто ошибка OOP)) – Deep

+0

@Deep Пример объекта, имеющего свойства, где функции заданы как значения, будет 'document', или' window' – guest271314

0

Если вы имеете дело с экземпляром класса, вы можете использовать что-то вроде этого.

Вам не нужно будет копировать функции, поскольку они делегированы на прототипе.

// myObject constructor 
 
function myObject(foo, bar){ 
 
    this.foo = foo 
 
    this.bar = bar 
 
} 
 
// delegate the functions to a prototype 
 
myObject.prototype.something = function(){ 
 
    console.log('something') 
 
} 
 

 
function instanceCopy(obj) { 
 
    // copy the object by the constructor 
 
    const copy = new obj.constructor() 
 
    const keys = Object.keys(obj) 
 
    keys.forEach(key => { 
 
    copy[key] = obj[key] 
 
    }) 
 
    return copy 
 
} 
 

 
const myObj = new myObject('foo', 'bar') 
 
const copyObj = instanceCopy(myObj) 
 

 
console.log('myObj', myObj) 
 
console.log('copyObj', copyObj) 
 
console.log('same ?', copyObj === myObj) 
 

 
// can we still call the functions 
 
copyObj.something()
<script src="https://codepen.io/synthet1c/pen/WrQapG.js"></script>

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