我正在使用角度和绘图来绘制原始数据或移动平均值。我有移动平均线工作,但我遇到了分配变量的问题。我检索一个用户对象数组,每个用户对象都有一个x和y键,其中包含与之关联的数组。
$scope.init=function(){
$rootScope.page='companyResults';
$scope.isPlotlyDone = false;
$scope.moving = false;
var refresh = function () {
incidentService.dayWiseTripsByUser(...).then(function (plotArray){
$scope.unaffectedPlot = plotArray;
$scope.movingAveragePlot = allMoving(plotArray);
console.log($scope.unaffectedPlot[0].y);
console.log($scope.movingAveragePlot[0].y);
});
};
refresh();
}
我是代码块,我希望$scope.unaffectedPlot[0].y
和$scope.movingAveragePlot[0].y
会有不同的数组,因为我通过以下一组函数来运行后者。奇怪的是两个$ scope变量都是同步的,所以如果我通过allMoving
运行第二个变量,unaffectedPlot
变量也会变得平滑,如果我不调用allMoving
,它们就不会明显同步。我对Angular有什么看法?使用切换进行移动平均线工作的好方法是什么?我的计划是显示一个变量或另一个变量,具体取决于是否单击了一个按钮。
var d3_numeric = function(x) {
return !isNaN(x);
}
var d3sum = function(array, f) {
var s = 0,
n = array.length,
a,
i = -1;
if (arguments.length === 1) {
// zero and null are equivalent
while (++i < n) if (d3_numeric(a = +array[i])) s += a;
} else {
while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;
}
return s;
};
var movingWindowAvg = function (arr, step) {
return arr.map(function (_, idx) {
var wnd = arr.slice(idx - step, idx + step + 1);
var result = d3sum(wnd) / wnd.length; if (isNaN(result)) { result = _; }
return result;
});
};
var allMoving = function(pltArray) {
var movingArray = [];
pltArray.forEach(function(plot){
var oneMoving = plot;
oneMoving.y = movingWindowAvg(plot.y, 5);
movingArray.push(oneMoving);
});
return movingArray;
}
答案 0 :(得分:1)
这实际上不是一个有角度的问题。我不得不测试它,因为我没有看到发生了什么。
当你写
时oneMoving.y = blah
你实际上改变了每个元素的绘图内容,然后无意中改变了plotArray的内容(因为plot是一个对象) 因此,当您说'var onMoving = plot')
时,您只创建一个引用变量要彻底解决您的问题,您可以克隆情节,但这不是一个过程
一种简单而又肮脏的方式是
JSON.parse(JSON.stringify(obj))
来自this帖子
我把一个可以捕捉到你的错误的例子放在一起
var array = [{one:1, two:2},{one:1, two:2},{one:1, two:2}],
copyArray = array,
newArr = doStuff(array)
function doStuff(a) {
var otherNewArr = []
a.forEach(function(ae) {
var aVar = ae
aVar.one = 5
otherNewArr.push(aVar)
})
return otherNewArr
}
console.log(copyArray,newArr)
要修复它,只需替换
var aVar = ae
与
var aVar = JSON.parse(JSON.stringify(ae))