2016-04-27 9 views
2

Ich verwende AngularJS zusammenfassen und ein JSON-Objekt aus einer API-Antwort haben, die wie folgt aussieht:Gruppe und json Daten auf neues JSON-Objekt

var data = [ 
    {"group": "red", "state": "running"}, 
    {"group": "red", "state": "closed"}, 
    {"group": "red", "state": "closed"}, 
    {"group": "blue", "state": "running"}, 
    {"group": "blue", "state": "running"} 
]; 

ich dieses Objekt in einer JavaScript-Funktion analysieren möchte erhalten folgendes Ergebnis:

var sumdata = [ 
    {"group": "red", "running": 1, "closed": 2, "summary": 3}, 
    {"group": "blue", "running": 2, "closed": 0, "summary": 2} 
]; 

Also, ich habe die erste Eigenschaft namens „Gruppe“, dann zählen, wie viele Objekte in dieser Gruppe zu Gruppe in fahrbereitem Zustand befinden, geschlossen Zustand und auch die Anzahl der Objekte zusammenfassen.

(Anmerkung: Ich würde keine zusätzlichen Javascript-Bibliotheken verwenden möchten wie LINQ.js )

Könnte yo mir bitte helfen?

habe ich versucht, die folgende, die durch die Gruppe fehlt und habe keine Ahnung, wie das in diese Funktion zu setzen:

var getSum = function (data) { 

    if (!data) { 

     $scope.data = []; 
    } 
    else { 

     for (var i = 0; i < data.length; i++) { 

      var group = data[i][0]; 
      var status = data[i][1]; 

      status = (status ? status.Name : "").toUpperCase(); 

      var running = 0; 
      var closed = 0; 

      switch (status) { 

       case "RUNNING": 
        running++; 
        break; 

       case "CLOSED": 
        closed++; 
        break; 

       default: 
        break; 
      } 
      var summary = running + closed;   
      $scope.dataSum.push({ "group": group, "running": running, "closed": closed, "summary": summary}); 
     } 
    } 

}; 
+2

Was haben Sie versucht? Veröffentlichen Sie den Code, den Sie bisher verwendet haben. Dies ist in der Regel kein "Wir schreiben Code für Sie" -Service – Draken

+1

Menschen verwechseln SO für einen kostenlosen Code-Service ... kein Kommentar – thegio

Antwort

2

Dies ist ein Vorschlag mit einem temporären Objekt und eine Array#forEach Schleife im Klar Javascript.

var data = [{ "group": "red", "state": "running" }, { "group": "red", "state": "closed" }, { "group": "red", "state": "closed" }, { "group": "blue", "state": "running" }, { "group": "blue", "state": "running" }], 
 
    grouped = function (array) { 
 
     var r = []; 
 
     array.forEach(function (a) { 
 
      if (!this[a.group]) { 
 
       this[a.group] = { group: a.group, running: 0, closed: 0, summary: 0 }; 
 
       r.push(this[a.group]); 
 
      } 
 
      this[a.group][a.state]++; 
 
      this[a.group].summary++; 
 
     }, Object.create(null)); 
 
     return r; 
 
    }(data); 
 

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

+1

Danke, es hat den Trick und war kürzer als das, was ich ausprobiert habe. (Ich erweitere deine Lösung mit der summarischen Eigenschaft) –

+0

richtig, mir fehlte das. –

0

Mit dem LINQ Macht wird es so ähnlich aussehen:

var data = [{ 
 
    "group": "red", 
 
    "state": "running" 
 
}, { 
 
    "group": "red", 
 
    "state": "closed" 
 
}, { 
 
    "group": "red", 
 
    "state": "closed" 
 
}, { 
 
    "group": "blue", 
 
    "state": "running" 
 
}, { 
 
    "group": "blue", 
 
    "state": "running" 
 
}]; 
 

 

 
var result = Enumerable.From(data).GroupBy('$.group', null, function(key, group) { 
 
    return { 
 
    group: key, 
 
    running: group.Where(function(value) { 
 
     return value.state == 'running' 
 
    }).Count(), 
 
    closed: group.Where(function(value) { 
 
     return value.state == 'closed' 
 
    }).Count(), 
 
    summary: group.Where(function(value) { 
 
     return value.state == 'running' || value.state == 'closed' 
 
    }).Count() 
 
    } 
 
}).ToArray() 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

+0

''Enumerable' ist undefined' ... sieht so aus, als wäre das Skript nicht richtig geladen ... –

+0

@NinaScholz Prüfe, ob du Zugriff auf https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2 hast .0.2/linq.js oder wechseln zu anderen CDN –

+0

Ich habe keinen Zugriff auf Cloudflare. –

0

Die unten Werke für eine beliebige Anzahl von Feldern in der snipped Datenfeld. Sie geben nur den Namen des Feldes an, nach dem Sie gruppieren möchten. Es ist besser als andere Beispiele in der Art, wie es für jede Art von Daten funktioniert, die nicht nur wie Sie vorgeschlagen benannt werden. Ich hoffe es hilft.

(function(){ 
     var data = [ 
         { "group": "red", "state": "running" }, 
         { "group": "red", "state": "closed" }, 
         { "group": "red", "state": "closed" }, 
         { "group": "blue", "state": "running" }, 
         { "group": "blue", "state": "running" }, 
         { "group": "blue", "state": "asd", "value":"33" }, 
         { "group": "blue", "state": "asd1", "value":"33" }, 
         { "group": "red", "state": "asd", "value":"33" } 
     ], 
     grouped = function (array) { 
      var r = []; 
      var groupFieldName = "group"; 

      array.forEach(function (a) { 
       var self = this; 
       if (!self[a[groupFieldName]]) { 
        var tempObj = { 
         group: a[groupFieldName] 
        }; 
        self[a[groupFieldName]] = tempObj; 
        r.push(self[a[groupFieldName]]); 
       } 
       var keys = Object.keys(a); 
       keys.forEach(function(key){ 
        if(key != groupFieldName){ 
         if(self[a[groupFieldName]][a[key]] == undefined){ 
          self[a[groupFieldName]][a[key]] = 1; 
         }else{ 
          self[a[groupFieldName]][a[key]]++; 
         } 
        } 
       }); 
      }, Object.create(null)); 
      return r; 
     }(data); 
     console.log(JSON.stringify(grouped)); 

})() 
+0

Danke. In meiner aktuellen Lösung brauche ich nur die Statistiken 'running' und 'close', die ich in einer Tabelle anzeigen kann. Aber wie Sie geschrieben haben, funktioniert Ihre Lösung mit jeder Art von Daten, die ein guter Punkt ist. –

+0

Ich bin froh, dass ich helfen kann. –