異なるインスタンスが個別に変更できるように、プロパティを値でコピーしようとしています。私の理解では、jQueryまたはZeptoの$ .extendを使用することは、「値によるコピー」を行うための優れた方法です。私の状況では機能していません。その理由を理解したいと思います。何が間違っているのかわかりません。
var c = [ {'purple' : 1}, { 'red':2 } ]
var x = { 'name': 'my obj', 'colors': c }
var doWork = function(passX) {
var inY = $.extend({},passX);
inY.colors[0].selected = true;
return inY;
}
var y = doWork(x);
console.log( x.colors[0].selected );// true, but I think it should be undefined
console.log( y.colors[0].selected );// true
本当に中心的なものが欠けているような気がします。同じオブジェクトから拡張してコピーを実行することはできませんか?関数の引数のスコープについて何か混乱がありますか?
jsFiddle: http: //jsfiddle.net/zfnyp/5/
編集:@Nikoが指摘しているように、私の混乱に対する答えは、ディープコピーがすべての子プロパティの値によるコピーバージョンを作成することです。深いコピーと浅いコピーは、コピーがいくつのプロパティを深くするかを意味すると思いました。おっと。
もう一度編集:Javascriptではディープコピーは面倒です。JQueryにはそれがありますが、ZeptoとUnderscoreにはありません。うまく実装するのは不可能だと言う人もいます。私の問題にこれを実装するために、オブジェクトの構造を知ることに依存するこのソリューションを作成しました。不格好ですが、これが私にとって正しい答えだと思います。
var c = [ {'purple' : 1, 'selected':false }, { 'red':2 } ]
var x = { 'name': 'my obj', 'colors': c }
var doWork = function(passX) {
var inY = $.extend({},passX);
inY.colors = $.extend([], passX.colors);
for (var i = 0; i < passX.colors.length; i++) {
inY.colors[i] = $.extend({}, passX.colors[i]);
}
inY.colors[0].selected = true;
return inY;
}
var y = doWork(x);
console.log( x.colors[0].selected );
console.log( y.colors[0].selected );