2016-05-02 4 views
0

Ich habe eine Liste von Objekten:Wie können Zeilenelemente mithilfe von Unterstrichen in Gruppen zusammengeführt werden?

var list = [ 
    {owner_email: "maxim", value: "v1"}, 
    {owner_email: "maxim", value: "v2"}, 
    {owner_email: "vlad", value: "v3"}, 
    {owner_email: "maxim", value: "v4"}, 
    {owner_email: "bob", value: "v5"}, 
    {owner_email: "bob", value: "v6"}, 
    {owner_email: "bob", value: "v7"}, 
    {owner_email: "vlad", value: "v8"}, 
    {owner_email: "maxim", value: "v9"}, 
    {owner_email: "maxim", value: "v10"}, 
    {owner_email: "bob", value: "v11"} 
    ]; 

Ich möchte underscores verwenden, in Reihe Elemente Gruppen zu verschmelzen.

So sollte die Ausgabe wie folgt aussehen:

output: [ 
{owner_email: "maxim", values: ["v1", "v2"]}, 
{owner_email: "vlad", values: ["v3"]}, 
{owner_email: "maxim", values: ["v4"]}, 
{owner_email: "bob", values: ["v5", "v6", "v7"]}, 
{owner_email: "vlad", values: ["v8"]}, 
{owner_email: "maxim", values: ["v9", "v10"]}, 
{owner_email: "bob", values: ["v11"]} 
] 

Wie Sie zum Beispiel in list ersten beiden Elemente E-Mail beziehen sich auf maxim deshalb I-Gruppe 1. und die zweite Linie sehen: {owner_email: "maxim", values: ["v1", "v2"]},.

Wie funktioniert es?

das, was ich bisher geschrieben:

$scope.result = []; 

    for(var i=0; i<list.length; i++){ 
     if(i === 0){ 
     $scope.result.push({ 
      owner_email: list[i].owner_email, 
      values: [list[i].value] 
     }); 
     } 
     else{ 

     var item = list[i]; 
     var oldItem = _.findWhere($scope.result, {owner_email:item.owner_email}); 
     if(!oldItem){ 
     $scope.result.push({ 
      owner_email: item.owner_email, 
      values: [item.value] 
     }); 
     } 
     else{ 
     console.log(oldItem); 

     angular.forEach($scope.result, function(_r){ 
      if(_r.owner_email === oldItem.owner_email){ 
       _r.values.push(item.value); 
      } 
      else{ 
      row = false; 
      } 
     }); 
     } 
    }// for 

This is a demo I play with

+0

iterieren Etwas mehr als die Array und Anhängen an den vorherigen/letzten Wert, wenn die Werte 'owner_email' gleich sind? Denke nicht, dass Unterstreichung irgendeine spezielle Hilfsmethode bietet. –

+0

es ist nicht so einfach wie es aussieht, inkrementieren Sie die Liste während der Iteration. – snaggs

Antwort

1

Hier ist eine Lösung, die gerade iteriert über die Liste und den Überblick über die aktuelle Position hält:

var output = []; 
var current = { owner_email: null }; 

_.each(list, function(item){ 
    if(item.owner_email != current.owner_email){ 
     current = { owner_email : item.owner_email, values: [item.value]}; 
     output.push(current); 
    } 
    else { 
     current.values.push(item.value); 
    } 
}); 
Verwandte Themen