Hatena::ブログ(Diary)

loiter on the sideroad

2009-08-12

jQueryでディープコピー

| 11:43

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冥利に尽きますな(ΦωΦ)

トラックバック - http://d.hatena.ne.jp/sideroad/20090812/1250045001
Connection: close