1

JSONデータをajaxを介してオブジェクトにロードし、そのオブジェクトを新しいオブジェクト(initDataおよびnewData)にコピーしています。newDataのプロパティを変更すると、initDataのプロパティも変更されます。なぜこうなった?

var initData = {};
var newData = {};    

function load_data(NDB_No){
    $.getJSON(('scripts/jsonencode.php?q=' + NDB_No), function(data) {

        for (prop in data){
            initData[prop] = data[prop];
            newData[prop] = data[prop];
        }

    console.log('init data: ' + initData.properties.Protein); // "init data: 0.259"
    console.log('new data: ' + newData.properties.Protein); // "new data: 0.259"

     var n = parseFloat(newData.properties.Protein);
     newData.properties.Protein = n+1;

    console.log('init data: ' + initData.properties.Protein + 'new data: ' + newData.properties.Protein); 
    // "init data: 1.259 new data: 1.259"
    // why are these the same when I only updated newData object?


    });


}
4

2 に答える 2

4

data[prop]オブジェクトのように見えます(後で参照しているためnewData.properties.Protein)。オブジェクトは常に参照によって渡され、変数はそれへのポインタにすぎません。

そもそもJSONを取得しているので、オブジェクトはJSON対応であり、それを使用してオブジェクトを「複製」できます。

$.getJSON(...,function(data) {
    initData = JSON.parse(JSON.stringify(data));
    newData = JSON.parse(JSON.stringify(data));
});

これにより、オブジェクトが確実に分離されます。これを行う方法は他にもありますが、これは組み込みメソッドを使用して手動の再帰を回避します(常に高速)

于 2013-03-05T01:45:20.087 に答える
0

これにより、両方が同じメモリスペースを参照するように設定されます。

initData[prop] = data[prop];
newData[prop] = data[prop];

...つまり、変更するnewDataと、も変更されinitDataます。参照で割り当てる代わりに、コピーを作成することをお勧めします。私は走らなければならないので、今のところその例を提供することはできません。

于 2013-03-05T01:45:50.813 に答える