jQueryでディープコピー

javascriptのオブジェクトの複製を


Object.clone = function(source) {
return $.extend({},source);
}
で空オブジェクトにコピーしてましたが、
このままだとシャローコピーだったのでハマッタヨ。

ガシカーシ、jQueryのソース眺めてたら。。。オッ
$.extendの一つ目の引数にtrueを追加しとくとディープコピーになるっぽい。
ということで、

Shallow Clone


Object.shallowCopy = function(source) {
return $.extend({},source);
}

var a = {a:{a:1},b:{a:1}};
var b = Object.shallowCopy(a);
b.a.a = 2;
window.alert(a.a.a); //2
window.alert(b.a.a); //2


Deep Clone


Object.deepCopy= function(source) {
return $.extend(true,{},source);
}

var a = {a:{a:1},b:{a:1}};
var b = Object.deepCopy(a);
b.a.a = 2;
window.alert(a.a.a); //1
window.alert(b.a.a); //2


せっかくなんでjQuery用に改良。


//object clone
(function($){
$.cloneObject = function(source,isDeep) {
if(isDeep){
return $.extend(true,{},source);
}
return $.extend({},source);
}
})(jQuery);

//使い方
var a = {a:{a:1},b:{a:1}};
var b = $.cloneObject(a); //シャローコピーで複製
b.a.a = 2;
window.alert(a.a.a); //2
window.alert(b.a.a); //2


var c = {a:{a:1},b:{a:1}};
var d = $.cloneObject(c,true); //引数にtrueを追加するとディープコピーで複製
d.a.a = 2;
window.alert(c.a.a); //1
window.alert(d.a.a); //2

jQuery冥利に尽きますな(ΦωΦ)