JavaScript数据数组的价值翻了一番

时间:2017-08-31 13:59:55

标签: javascript angularjs

我希望从REST端点返回数据,以便在按下按钮时填充图形。如果按下按钮两次,则数据加倍,但是,在这种情况下,我希望删除旧数据,只显示新数据。

E.g。 按下第一个按钮,这是返回的数据:

{19455746: 28, 22254286: 83, 22255638: 136, 22808354: 34}

在第二个按钮上按此键返回:

{19455746: 56, 22254286: 166, 22255638: 272, 22808354: 68}

在这种情况下,我只想在按下第二个按钮时返回以下内容:

{19455746: 28, 22254286: 83, 22255638: 136, 22808354: 34}

我按下按钮按下的JavaScript代码如下,我试图将其缩小到我认为相关的内容,如果需要更多代码,请告诉我们):

$scope.getDateRangeRoom = function () {
    $scope.data = null; 
    var obj = {};
    condata = null;
    ...
    $q.all(NexaService.getRoomDateRange(roomName, startDate, secondDate))
            .then(function (response) {
                for (var x = 0; x < response.length; x++) {
                    conData.push(response[x].data);
                }
                $scope.loaded = true;
                for (var x = 0; x < conData.length; x++) {
                    for (var i = 0, j = conData[x].length; i < j; i++) {
                        if (obj[conData[x][i].sensorUUID]) {
                            obj[conData[x][i].sensorUUID]++;
                        } else {
                            obj[conData[x][i].sensorUUID] = 1;
                        }
                    }
                }
                var sensorNameArray = Object.keys(obj);
                var sensorDataArray = sensorNameArray.map(key => obj[key]);
                $scope.data = sensorDataArray;
                ...
}

如何确保删除以前的数据并仅返回新数据?

1 个答案:

答案 0 :(得分:2)

condata = null;替换为var conData = []行。你只需要在函数中使用这个变量,每次调用getDateRangeRoom()时它都必须是另一个 - 空 - 数组。

您没有显示当前创建此变量的位置;我的理解是它是一个共同的范围状态。即使你将它变成一个空数组,也有可能在.then次调用中重新填充两次(甚至更多)。

...如果由于某种原因,你确实要分享它,只在重新填充之前清理它。例如:

.then(function (response) {
  conData = [];
  for (var x = 0; x < response.length; x++) {
    conData.push(response[x].data);
  }
  // ... there goes the rest

事实上,你可以写得更简洁:

conData = response.map(row => row.data);