2016-09-19 1 views
1

Ich habe ein Rohdaten wie folgt aus:Filtern, Gruppieren und Aggregieren von Daten unter Verwendung von Underscore.js

var data = { 
    "issues": [ 
    { 
     "fields": { 
     "project": { 
      "key": "ProjectA" 
     }, 
     "components": [ 
      { 
      "name": "Component A" 
      }, 
      { 
      "name": "Component C" 
      } 
     ], 
     "priority": { 
      "name": "P0" 
     }, 
     "status": { 
      "name": "Closed" 
     } 
     } 
    }, 
    { 
     "fields": { 
     "project": { 
      "key": "ProjectA" 
     }, 
     "components": [ 
      { 
      "name": "Component B" 
      } 
     ], 
     "priority": { 
      "name": "P1" 
     }, 
     "status": { 
      "name": "Reopened" 
     } 
     } 
    }, 
    { 
     "fields": { 
     "project": { 
      "key": "ProjectA" 
     }, 
     "components": [ 
      { 
      "name": "Component B" 
      } 
     ], 
     "priority": { 
      "name": "P1" 
     }, 
     "status": { 
      "name": "Closed" 
     } 
     } 
    }, 
    { 
     "fields": { 
     "project": { 
      "key": "Project B" 
     }, 
     "components": [ 
      { 
      "name": "Component X" 
      } 
     ], 
     "priority": { 
      "name": "P1" 
     }, 
     "status": { 
      "name": "Closed" 
     } 
     } 
    } 
    ] 
}; 

Wenn ich ProjectA als Input geben, würde ich filtern möchte, Gruppe und die Ausgabe aggregiert wie folgt:

"components": [ 
    { 
    "name": "Component A", 
    "priorities": [ 
     { 
     "name": "P0", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 0 
      }, 
      { 
      "name": "Closed", 
      "count": 1 
      } 
     ] 
     }, 
     { 
     "name": "P1", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 0 
      }, 
      { 
      "name": "Closed", 
      "count": 0 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "name": "Component B", 
    "priorities": [ 
     { 
     "name": "P0", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 0 
      }, 
      { 
      "name": "Closed", 
      "count": 0 
      } 
     ] 
     }, 
     { 
     "name": "P1", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 1 
      }, 
      { 
      "name": "Closed", 
      "count": 1 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "name": "Component C", 
    "priorities": [ 
     { 
     "name": "P0", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 0 
      }, 
      { 
      "name": "Closed", 
      "count": 1 
      } 
     ] 
     }, 
     { 
     "name": "P1", 
     "status": [ 
      { 
      "name": "Open", 
      "count": 0 
      }, 
      { 
      "name": "Reopened", 
      "count": 0 
      }, 
      { 
      "name": "Closed", 
      "count": 0 
      } 
     ] 
     } 
    ] 
    } 
] 

Ich habe versucht, Verkettung, Filterung, Gruppierung, aber nicht sicher, wie dies zu verwenden, da meine Daten zu verschachtelt ist.

Antwort

2

Dies ist ein Vorschlag in einfachem JavaScript mit zuerst alle Komponenten und Prioritäten sammeln und dann ein Ergebnisobjekt erstellen und später die Anzahl der Status erhöhen.

var data = { "issues": [{ "fields": { "project": { "key": "ProjectA" }, "components": [{ "name": "Component A" }, { "name": "Component C" }], "priority": { "name": "P0" }, "status": { "name": "Closed" } } }, { "fields": { "project": { "key": "ProjectA" }, "components": [{ "name": "Component B" }], "priority": { "name": "P1" }, "status": { "name": "Reopened" } } }, { "fields": { "project": { "key": "ProjectA" }, "components": [{ "name": "Component B" }], "priority": { "name": "P1" }, "status": { "name": "Closed" } } }, { "fields": { "project": { "key": "Project B" }, "components": [{ "name": "Component X" }], "priority": { "name": "P1" }, "status": { "name": "Closed" } } }] }, 
 
    componentsO = Object.create(null), 
 
    prioritiesO = Object.create(null), 
 
    components, 
 
    priorities, 
 
    status_ = ['Open', 'Reopened', 'Closed'], // status collides in chrome with window.status 
 
    hash = Object.create(null), 
 
    getKey = function (a) { return a.join('|'); }, 
 
    result = {}; 
 

 
data.issues.forEach(function (issue) { 
 
    if (issue.fields.project.key === 'ProjectA') { 
 
     issue.fields.components.forEach(function (component) { 
 
      componentsO[component.name] = true; 
 
     }); 
 
     prioritiesO[issue.fields.priority.name] = true; 
 
    } 
 
}); 
 

 
components = Object.keys(componentsO).sort(); 
 
priorities = Object.keys(prioritiesO).sort(); 
 

 
result.components = components.map(function (component) { 
 
    return { 
 
     name: component, 
 
     priorities: priorities.map(function (priority) { 
 
      return { 
 
       name: priority, 
 
       status: status_.map(function (status) { 
 
        var key = getKey([component, priority, status]); 
 
        hash[key] = { name: status, count: 0 }; 
 
        return hash[key]; 
 
       }) 
 
      }; 
 
     }) 
 
    } 
 
}); 
 

 
data.issues.forEach(function (issue) { 
 
    if (issue.fields.project.key === 'ProjectA') { 
 
     issue.fields.components.forEach(function (component) { 
 
      var key = getKey([component.name, issue.fields.priority.name, issue.fields.status.name]); 
 
      hash[key].count++; 
 
     }); 
 
    } 
 
}); 
 

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

+0

Ich erhalte 'status.map' kein Funktionsfehler ist. –

+0

meinst du diesen Teil 'status: status.map (Funktion (status) {...'? Bitte überprüfe ob 'Array.isArray (status) === true'.) Hast du eine andere Variable mit dem Namen 'status' und Ein Typenkonflikt –

+0

Ich habe gerade Ihren Code-Ausschnitt ausgeführt, ohne etwas zu ändern, indem ich die Funktion "Code-Ausschnitt ausführen" in SO verwendete. –

Verwandte Themen