2016-03-27 8 views
1

Ich habe 1 API/Projekte, die eine JSON mitAngular Dienste - mehrere Abfragen und Summieren

[ 
    { 
     "id":100, 
     "name":"some name", 
     "x": "y" 
    }, 
    { 
     "id":200, 
     "another name", 
     "x": "z" 
    } 
] 

kehrt dann habe ich eine andere API/Kosten nennen, die etwas ähnliches zurückgibt:

[ 
    { 
     "projectid":100, 
     "cost":300 
    }, 
    { 
     "projectid":100, 
     "cost":100 
    }, 
    { 
     "projectid":200, 
     "cost":500 
    } 
] 

I schrieb zur Zeit ein Durcheinander von Ajax/Jquery/JS-Code, der ein JS-Objekt mit "ID", "Name" und den summierten "Kosten" erstellt. Und ich string es einfach an ein JSON-Objekt.

Die folgenden Abfragen waren jedoch komplexer und es schien eine ineffiziente und fast unmögliche Möglichkeit, durch rohe JS zu tun, also wechselte ich zu eckigen Diensten, da es einfacher wäre, für das Front-End-Team zu injizieren.

Ich bin überhaupt nicht vertraut mit eckigen, und ich habe nur einen einfachen Dienst, der alle Projekte oder 1 Projekt mit der ID abfragt.

Ist es möglich, in Angular die API abfragen und eine JSON erstellen, die und id von der ersten Abfrage nur die Namen gab, und fasst die für das entsprechende Projekt in der zweiten Abfrage kosten und gibt eine JSON mit:

[ 
    { 
     "id":100, 
     "name":"some name", 
     "cost":400 
    } 
] 
[ 
    { 
     "id":200, 
     "name":"another name", 
     "cost":200 
    } 
] 

Dank

Antwort

1

Einige Pseudo-Code:

var projects = null; 
$http.get('API/projects').then(function(response) { 
     projects = JSON.parse(response.data); 
     $http.get('API/costs').then(function(response) { 
      var costs = JSON.parse(response.data); 
      projects.forEach(function(project) { 
       var sum = 0; 
       costs.forEach(function(cost) { 
        if (project.id === cost.projectid) { 
         sum += cost.cost; 
        } 
       }); 
       project.cost = sum; 
      }); 
     }; 
    }); 
console.log(projects); 

Sollte mit etwas Feinabstimmung arbeiten. Konnte viel eleganter obwohl sein ...

+0

Giving a versucht es jetzt – arthur

+0

ich „lesen kann nicht Eigentum‚und dann‘undefinierter bei neuen “ erhalte, die mein Verständnis etwas ohne Rückkehr in der Funktion zu tun hat $ http in der Funktion? Muss es eine Rückkehr haben? – arthur

+0

Nevermind, fand es heraus. Danke, das ist, was ich gesucht habe. – arthur

3

Dieses ist eine Lösung mit einfachem Javascript und linearer Komplexität.

var project = [{ "id": 100, "name": "some name", "x": "y" }, { "id": 200, name: "another name", "x": "z" }], 
 
    cost = [{ "projectid": 100, "cost": 300 }, { "projectid": 100, "cost": 100 }, { "projectid": 200, "cost": 500 }], 
 
    merged = function (p, c) { 
 
     var o = {}, 
 
      r = p.map(function (a) { 
 
       o[a.id] = { id: a.id, name: a.name, cost: 0 }; 
 
       return o[a.id]; 
 
      }); 
 
     c.forEach(function (a) { 
 
      o[a.projectid].cost += a.cost; 
 
     }); 
 
     return r; 
 
    }(project, cost); 
 

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