2017-11-03 5 views
1

私のapp-config.jsファイルから変数にロードして、その状態が変更されないようにするために.slice()でコピーしています。私の嫌悪感の多くは、私がデータを変更するために使用している機能は、突然変異を避けるこの試みを尊重していないようです。 mySensitivityVarsは変化し続けますが、私はちょうどmySeriesに直接的に作用しているので、私はどうしたらよいか分かりません。なぜこれが起こっているのかについてのアイデアはありますか?ここでは、コードがあります:slice()を使用した後に配列が変更されるのはなぜですか?

var mySeries = mySensitivityVars.slice(); 


//Dummy Processing Algorithm 
    function myDummyAlgo(sliderIndex, newValue, range) { 
     console.log(mySeries[sliderIndex].data) 

     var modifier = newValue/(range/2) 
     var newSeries = mySensitivityVars[sliderIndex].data.map(function(num){ 
      return num * modifier 
     }) 
     console.log(newSeries) 
     // mySeries[sliderIndex].data = newSeries 

     // console.log(sensitivityChart.series[0].data) 
     sensitivityChart.series[sliderIndex].setData(newSeries); 
    }; 
+9

'.slice'はディープコピーではなく** shallow **コピーを作成します。 –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice –

+0

@Jonasw:配列内のオブジェクトにはメソッドがあるようですので、これはうまくいかないでしょう。 –

答えて

1

mySensitivityVarsの内容を見ることなく、それは言うのは難しいのですが、私の推測では、あなたは元のオブジェクトではなく、重複したオブジェクトへの参照を変異しています。

mySensitivityVarsに何かオブジェクトがありますか?その場合、mySeriesの対応するオブジェクトは、スタンドアロンの複製ではなく、mySensitivityVarsの元のオブジェクトを指しているため、おそらく突然変異の問題が発生しています。

+0

[* **参照は**あなたが意味するものとは異なる意味です](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference)オブジェクトは*参照型*の値ですが、これは "参照渡し"とは関係ありません。多くの人が間違いをしています... –

+0

@FelixKling非常に真実です。それに応じて編集。 – Faisal

2

スライスは配列をコピーすることができますが、配列内で参照されているすべてのオブジェクトは、あなたが行うと(参照だけがコピーされます)

0

コピー取得されていません。

mySeries[sliderIndex].data newSeries; 

が配列mySeriesがコピーでありますmySensitivityVarsですが、配列内のオブジェクトはコピーではありません。両方の配列には同じオブジェクトへの参照が含まれており、dataプロパティを変更するとその両方に影響します。

mySeries = mySentitivyVars.map(o => Object.assign({}, o)); 

オブジェクトに他のオブジェクトへの参照が含まれている場合は、ディープコピーを行う必要があります。 What is the most efficient way to deep clone an object in JavaScript?

1

突然変異させたい場合は、コピーするのではなく複製する必要があります。 JSON.parse(JSON.stringify(mySensitivityVars))を使用することができます。これはかなり高速な深層クローニング技術です。 は、新しいオブジェクトが確実に割り当てられ、参照のコピーは保証されません。

+0

ありがとう!!これは効果的な解決策に終わった。 Marcinはコピーされているオブジェクトは実際には参照であり、配列自体は新しいコピーであると述べたという事実を考慮して意味をなさない。 – yoursweater

関連する問題