2012年7月31日火曜日

思いつき

ちょっと面白いアプリを思いついたので、作ってみることにする。
できるかなぁ?

2012年7月22日日曜日

javascript の 配列とかオブジェクトをコピーする

Clone Anything with JavaScript
http://davidwalsh.name/javascript-clone

難しそうだなーと思ったんだけど、テキトーにやってみた。
リンク先にコメントを書いたんだけど、改行とかがグチャグチャになった。
ごめんなさい外人さん。謝る英語がわかりません。
あと、なんか見たらコメント消えてたから、書き直したら二重に投稿された。
どうしよう。あわわわわわあわわわわわわ。

var clone = function(o){
    var Clone = function(o){
        var self = this;
        if(o instanceof Array){
            for(var i = 0,l = o.length;i < l;++ i){
                self[i] = o[i];
            }
        }else{
            for(var n in o){
                self[n] = o[n];
            }
        }
    };
    if((!o)||(typeof(o) !== "object")){
        return o;
    }else{
        o = new Clone(o);
        return o;
    }
};

/* 以下動きを検証している感じ */

var myObject = {hoge:"hogehoge"};
var cloned = clone(myObject);
alert("1 hogehoge と出て欲しい -> " + cloned.hoge);

myObject.hoge = "ohohohoho";
alert("2 hogehoge と出て欲しい -> " + cloned.hoge);
cloned.hoge = "ababababa";
alert("3 ababababa と出て欲しい -> " + cloned.hoge);

var next_clone = clone(myObject);
alert("4 ohohohoho と出て欲しい -> " + next_clone.hoge);
alert("5 ababababa と出て欲しい -> " + cloned.hoge);


var myArray = ["mogemoge","mugamuga","morimori"];
var array_clone = clone(myArray);
alert("6 mugamuga と出て欲しい -> " + array_clone[1]);
myArray[1] = "uhiuhi";
alert("7 mugamuga と出て欲しい -> " + array_clone[1]);

var deep = {obj:{hoge:"huga",func:function(){alert("do something");}}};
var deep_clone = clone(deep);
alert("8 huga と出て欲しい -> " + deep_clone.obj.hoge);
alert("9 次に do something と出て欲しい");
deep_clone.obj.func();

var myStr = "ho---ge";
var str_clone = clone(myStr);
alert("10 ho---ge と出て欲しい -> " + str_clone);
alert("11 ababababa と出て欲しい -> " + cloned.hoge);

別に

var Clone = function(o){
    if((!o)||typeof(o) !== "object"){return;}
    var self = this;
    if(o instanceof Array){
        for(var i = 0,l = o.length;i < l;++ i){
            self[i] = o[i];
        }
    }else{
        for(var n in o){
            self[n] = o[n];
        }
    }
};

var myObj  = {test:"huga"};
var cloned = new Clone(myObj);

でも動くことには動くと思うんだけど、
引数の o が object 以外だった時に、複製できない。

if((!o)||typeof(o) !== "object"){this = o;return;} // <- エラーになる

とか

if((!o)||typeof(o) !== "object"){return o;} // <- 意味なし

とか出来ないので、clone()の中で object かどうか判断してからーって感じです。

きっと、俺でも思いつくので、外国の凄い人は思いついた上で採用していないのだろう。
つまり、なんかしらこの方法だと問題あるんだろうなぁ。
そこがわからないので、俺は未熟なんだろうなぁとおもいます。

でも、とりあえず動くから良いよね!