2017-05-27 6 views
3

Ich habe ein Objekt wie:Mehrere Summen Objekt effizient d3.js

{ 
    [ 

     { id: "AL01", 
     list: [ 
        { speed : 5 
        value : 10} , 
        { speed : 7 
        value : 15} 
       ] 
    }, 
    { id: "AB01", 
     list: [ 
       { speed : 20 
        value : 1} , 
       { speed : 8 
        value : 10} 
       ] 
    } 

] 

} 

und ich möchte dieses Ergebnis haben wie:

{[ { id: "AL01", speed: 12, value: 25}, { id: "AB01", speed: 28, value: 11}]} 

Wie kann ich diese bekommen effizient? Wenn es möglich ist, nur einmal die Funktionen map oder forEach auszuführen? Ich frage mich etwas, das nur einmal pro Objekt geht.

Antwort

1

Sie benötigen einige weitere Schleifen, um das Ergebnis zu erhalten.

Grundsätzlich das äußere Array, dann iterieren Sie list und verwenden Sie ein anderes Array für die Schlüssel. Sammeln Sie dann alle Daten und geben Sie ein neues Objekt mit einer neuen Struktur zurück.

var array = [{ id: "AL01", list: [{ speed: 5, value: 10 }, { speed: 7, value: 15 }] }, { id: "AB01", list: [{ speed: 20, value: 1 }, { speed: 8, value: 10 }] }], 
 
    result = array.map(function (a) { 
 
     var temp = { id: a.id, speed: 0, value: 0 }; 
 
     a.list.forEach(function (b) { 
 
      ['speed', 'value'].forEach(function (k) { 
 
       temp[k] += b[k]; 
 
      }); 
 
     }); 
 
     return temp; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

ist Ihre Datenstruktur nicht korrekt. Sie müssen eine Eigenschaft für das äußerste Array im Datenobjekt haben. Dementsprechend kann man wie folgt vorgehen;

var data = {groups: [ {id: "AL01", list: [{ speed : 5, value : 10}, { speed : 7, value : 15}]}, {id: "AB01", list: [{ speed : 20, value : 1 }, { speed : 8, value : 10}]}]}, 
 
    result = {groups: data.groups.map(g => Object.assign({id: g.id},g.list.reduce((r,c) => ({speed : r.speed + c.speed, value : r.value + c.value}))))}; 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }