ECMAScript5 でオブジェクトのディープ コピーを行うサンプル コードを見つけたいと思います。
コピーはクローンできるはずです
ネストされたオブジェクト
ネストされた配列
配列内のネストされたオブジェクト (各配列項目を個別に複製)
注: jQuery.extend() はケース 3 を処理しないようです)。また、クリーンな ECMAScript でこれを行いたいと考えています。簡単なグーグル検索では、価値のある実装は見つかりませんでした。
ECMAScript5 でオブジェクトのディープ コピーを行うサンプル コードを見つけたいと思います。
コピーはクローンできるはずです
ネストされたオブジェクト
ネストされた配列
配列内のネストされたオブジェクト (各配列項目を個別に複製)
注: jQuery.extend() はケース 3 を処理しないようです)。また、クリーンな ECMAScript でこれを行いたいと考えています。簡単なグーグル検索では、価値のある実装は見つかりませんでした。
jQuery.extend()
他の良い実装が見つからなかったので、私はついに落ち着きました
ワンライナーが必要な場合 (参照されたオブジェクトを反復処理してプリミティブを取得することでオブジェクト参照を削除し、1 つの大きな文字列を連結してから、その文字列を独自のプリミティブ リーフ ノードを持つ新しいオブジェクトに解析します)
JSON.parse(JSON.stringify(obj))
または、多くのコピーを実行する必要がある場合
function deepCopy(o) {
var copy = o,k;
if (o && typeof o === 'object') {
copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {};
for (k in o) {
copy[k] = deepCopy(o[k]);
}
}
return copy;
}
オブジェクトをコピーするには、toSource メソッドのエミュレーションを使用します。
<script type="text/javascript">
Object.prototype.getSource = function() {
var output = [], temp;
for (var i in this) {
if (this.hasOwnProperty(i)) {
temp = i + ":";
switch (typeof this[i]) {
case "object" :
temp += this[i].getSource();
break;
case "string" :
temp += "\"" + this[i] + "\""; // add in some code to escape quotes
break;
default :
temp += this[i];
}
output.push(temp);
}
}
return "{" + output.join() + "}";
}
var baz = {"alpha":{"beta":{"charlie": ["delta","epsilon",{"omega":"zeta"}]}}};
!!Object.prototype.toSource ? alert((baz).toSource() ) : alert((baz).getSource() );
</script>