我从app-config.js文件中加载一个变量,然后用.slice()复制它,以防止其状态发生变异。令我非常懊恼的是,我用来改变数据的功能似乎没有考虑到这种避免变异的尝试。 mySensitivityVars
不断变化,但由于我只是直接对mySeries
采取行动,因此我不太确定。关于为什么会发生这种情况的任何想法?这是代码:
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);
};
答案 0 :(得分:2)
Slice可以复制数组,但是不会复制数组中引用的任何对象(只复制引用)
答案 1 :(得分:1)
没有看到mySensitivityVars
的内容很难说,但我的猜测是你改变了对原始对象的引用而不是重复的对象。
mySensitivityVars
中有任何物品吗?如果是这样,mySeries
中的相应对象将指向mySensitivityVars
中的原始对象而不是独立的副本,这就是您可能会看到突变问题的原因。
答案 2 :(得分:1)
如果你想让它变异,你应该克隆数组而不是复制它。你可以使用JSON.parse(JSON.stringify(mySensitivityVars))这是一种非常快速的深度克隆技术。 这将确保分配新对象,而不是复制引用。
答案 3 :(得分: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?