2012-02-22 9 views
5

配列の配列を複製する関数を作成しようとしています。私はblah.slice(0)を試しました。参照をコピーするだけです。私は原本をそのまま残す複写物を作る必要がある。配列の配列をコピーまたは複製する方法

私はそれが動作しますが、私が使用しているjQueryプラグインを台無しhttp://my.opera.com/GreyWyvern/blog/show.dml/1725165

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

で、このプロトタイプの方法を発見した - ので、私は機能にそれを有効にする必要があります...と再帰は私ではありません最強。

あなたのお役に立てれば幸いです!

乾杯、例えば

+1

ごとに改善var' 'で "I" を宣言してください! 'for ... in'ループで配列を繰り返し処理することは危険です。数値インデックスを使用する方がはるかに安全です。 – Pointy

+0

参照:http://stackoverflow.com/questions/565430/deep-copying-an-array-using-jquery –

答えて

5
function clone (existingArray) { 
    var newObj = (existingArray instanceof Array) ? [] : {}; 
    for (i in existingArray) { 
     if (i == 'clone') continue; 
     if (existingArray[i] && typeof existingArray[i] == "object") { 
     newObj[i] = clone(existingArray[i]); 
     } else { 
     newObj[i] = existingArray[i] 
     } 
    } 
    return newObj; 
} 
+0

これは完全に機能しました!ありがとうございました。 – Jeremy

+0

素晴らしい。まさに私が必要なもの! – tuj

2

は:

clone = function(obj) { 
    if (!obj || typeof obj != "object") 
     return obj; 
    var isAry = Object.prototype.toString.call(obj).toLowerCase() == '[object array]'; 
    var o = isAry ? [] : {}; 
    for (var p in obj) 
     o[p] = clone(obj[p]); 
    return o; 
} 

はコメント

+1

nullのために壊れます(null.popがスローします)。最初のチェックは 'if(typeof obj!=" object "||!obj)'のようなものでなければなりません。 –

+0

また、継承されたプロパティーの疑わしい処理 - JavaScriptの "クローン"には問題のあるセマンティクスがあります。 – Pointy

関連する問題