2017-08-31 2 views
0

Ich bin auf der Suche nach Daten aus einem REST-Endpunkt, um ein Diagramm auf Knopfdruck zu füllen. Wenn die Taste zweimal gedrückt wird, werden die Daten verdoppelt. In diesem Fall möchte ich jedoch die alten Daten löschen und nur die neuen Daten anzeigen.JavaScript Data Arrays verdoppelt Wert

z. Auf dem ersten Tastendruck ist dieser die Daten zurückgegeben:

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

Drücken Sie auf der zweiten Taste dieses zurückgegeben:

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

In diesem Fall würde ich nur folgende zurück auf der zweiten Taste drücken will:

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

Mein JavaScript-Code, der der Tastendruck auslöst, ist unten, ich habe versucht, diese zu fällen, was ich glaube, relevant zu sein, lassen Sie mich wissen, wenn mehr Code ist erforderlich):

$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; 
       ... 
} 

Wie kann ich sicherstellen, dass die vorherigen Daten gelöscht werden und nur die neuen Daten zurückgegeben werden?

Antwort

2

condata = null; durch var conData = [] ersetzen. Sie brauchen diese Variable nur innerhalb der Funktion UND muss jedes Mal ein anderes - leeres - Array sein, wenn Sie getDateRangeRoom() aufrufen.

Sie haben nicht angezeigt, wo diese Variable derzeit erstellt wird; Mein Verständnis ist, dass es ein gemeinsamer Geltungsbereich ist. Selbst wenn Sie es in ein leeres Array umwandeln, besteht die Möglichkeit, dass es unter .then Aufrufen zweimal (oder sogar mehr) neu gefüllt wird.

... und wenn Sie aus irgendeinem Grund in der Tat teilen, reinigen Sie es nur genau vor der Neubesiedlung. Zum Beispiel:

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

In der Tat, können Sie schreiben dies noch prägnanter:

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

, die noch die Daten verursacht zu verdoppeln. – Colin747

+0

Überprüfen Sie das Update. – raina77ow

+0

Entschuldigung, ich hatte einen Kleinbuchstaben "D", als ich Ihre Änderung hinzugefügt habe. Es funktioniert jetzt wie erwartet. Danke für Ihre Hilfe! – Colin747