Упрощенный пример глубокого копирования (клонирования) объекта (
он же в песоцнице):
var toString = Object.prototype.toString;
var isObject = RecursiveIterator.isObject;
/**
* @param {*} any
* @returns {String}
*/
function getType(any) {
return toString.call(any).slice(8, -1);
}
/**
* @param {*} any
* @returns {*}
*/
function shallowCopy(any) {
var type = getType(any);
switch (type) {
case 'Object':
return {};
case 'Array':
return [];
case 'Date':
return new Date(any);
case 'RegExp':
return new RegExp(any);
case 'Number':
case 'String':
case 'Boolean':
case 'Undefined':
case 'Null':
return any;
default:
return any.toString();
}
}
/**
* @param {*} any
* @param {Boolean} [deep]
* @returns {*}
*/
function copy(any, deep = false) {
if (!deep || !isObject(any)) {
return shallowCopy(any);
}
var map = new Map();
var rootNode = shallowCopy(any);
map.set(any, rootNode);
for(var {parent, node, key} of new RecursiveIterator(any, 1, true)) {
var parentNode = map.get(parent);
var cloneNode = shallowCopy(node);
parentNode[key] = cloneNode;
map.set(node, cloneNode);
}
map.clear();
return rootNode;
}
// ---------------------------------
// USAGE
// ---------------------------------
var some = {
foo: {
bar: 1
}
};
var clone = copy(some, true);
alert(JSON.stringify(clone));
alert(clone === some);
Если немного настроить, можно задавать глубину копирования, копировать с циклическими ссылками и пр.