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)));