在角度更新中,一个变量莫名其妙地更新另一个变量

时间:2016-11-30 03:40:39

标签: javascript angularjs plotly

我正在使用角度和绘图来绘制原始数据或移动平均值。我有移动平均线工作,但我遇到了分配变量的问题。我检索一个用户对象数组,每个用户对象都有一个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;
}

1 个答案:

答案 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))