Problems with cloneObject
cloneObject from https://gist.github.com/NV/1396086 trips up on objects whose values include null, Array, Date, RegExp.
by Scott Shepherd
JavaScript
function cloneObject(object) {
return extendObject({}, object);
}
function extendObject(base, object) {
var visited = [object];
// http://en.wikipedia.org/wiki/Adjacency_list_model
var set = [{value: base}];
_extend(base, object);
return base;
function _extend(base, object) {
for (var key in object) {
var value = object[key];
if (typeof value === 'object') {
var index = visited.indexOf(value);
if (index === -1) {
visited.push(value);
var newBase = base[key] = {};
set.push({up: base, value: newBase});
_extend(newBase, value);
} else {
base[key] = set[index].value;
}
} else {
base[key] = value;
}
}
}
}
var a = {
null: null,
obj: {
x: 1
},
array: [1, 2, 3],
int: 1,
date: new Date(),
regex: /\w+/g
};
b = cloneObject(a);
c = _.cloneDeep(a);
console.log('');
console.log('object:');
console.log('original %s', JSON.stringify(a));
console.log('cloneObject %s', JSON.stringify(b));
console.log('_.cloneDeep %s', JSON.stringify(c));
console.log('');
console.log('regexp match:');
console.log('original %s', JSON.stringify('hello world'.match(a.regex)));
console.log('cloneObject %s', JSON.stringify('hello world'.match(b.regex)));
console.log('_.cloneDeep %s', JSON.stringify('hello world'.match(c.regex)));