Skip to content

Instantly share code, notes, and snippets.

@Leko
Last active August 29, 2015 14:17
Show Gist options
  • Save Leko/ef8b520efd4339265383 to your computer and use it in GitHub Desktop.
Save Leko/ef8b520efd4339265383 to your computer and use it in GitHub Desktop.
deep clone object/array mixed
function isArray(obj) {
var str = Object.prototype.toString.call(obj).slice(8, -1);
return (str === 'Array');
}
function deepClone(obj) {
var copy = isArray(obj) ? [] : {};
for(var p in obj) {
if(!obj.hasOwnProperty(p)) continue;
if(isArray(obj[p])) {
copy[p] = deepClone(obj[p], []);
} else if(typeof obj[p] === 'object') {
copy[p] = deepClone(obj[p]);
} else {
copy[p] = obj[p];
}
}
return copy;
}
var a = {
key1: 1,
key2: 'a',
key3: false,
key4: null,
key5: undefined,
key6: [1, 2, 3, 4, 5],
key7: {
key7_1: [{
hoge: 1,
foo: 2,
bar: 3,
}]
}
}
var b = deepClone(a);
console.assert(b !== a, 'b !== a');
b.key1 = 2;
console.assert(b.key1 !== a.key1, 'b.key1 !== a.key1');
b.key2 = 'b';
console.assert(b.key2 !== a.key2, 'b.key2 !== a.key2');
b.key3 = true;
console.assert(b.key3 !== a.key3, 'b.key3 !== a.key3');
b.key4 = undefined;
console.assert(b.key4 !== a.key4, 'b.key4 !== a.key4');
b.key5 = null;
console.assert(b.key5 !== a.key5, 'b.key5 !== a.key5');
console.assert(b.key6 !== a.key6, 'b.key6 !== a.key6');
b.key6[0] += 100;
console.assert(b.key6[0] !== a.key6[0], 'b.key6[0] !== a.key6[0]');
console.assert(b.key7 !== a.key7, 'b.key7 !== a.key7');
console.assert(b.key7.key7_1 !== a.key7.key7_1, 'b.key7.key7_1 !== a.key7.key7_1');
console.assert(b.key7.key7_1[0] !== a.key7.key7_1[0], 'b.key7.key7_1[0] !== a.key7.key7_1[0]');
b.key7.key7_1[0].hoge = 'aaa';
console.assert(b.key7.key7_1[0].hoge !== a.key7.key7_1[0].hoge, 'b.key7.key7_1[0].hoge !== a.key7.key7_1[0].hoge');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment