2016-05-12 13 views
0

Grundsätzlich habe ich ein Array mit Objekten und sie müssten zusammen gruppiert werden. Es ist ein bisschen schwer zu erklären, aber es könnte einfacher sein, wenn ich euch nur ein Beispiel geben würde.Erstellen Sie eine Sammlung von Objekten mit Underscore

Ergebnisdaten

[ 
{ 
    "Category": "Préparé", 
    "Sandwich": "Martino", 
    "Ingredient": "Ansjovis", 
    "Price": 3.1 
}, 
{ 
    "Category": "Préparé", 
    "Sandwich": "Martino", 
    "Ingredient": "Tabasco", 
    "Price": 3.1 
}, 
{ 
    "Category": "Veggie", 
    "Sandwich": "Gezond", 
    "Ingredient": "Tomaat", 
    "Price": 2.5 
}, 
{ 
    "Category": "Veggie", 
    "Sandwich": "Gezond", 
    "Ingredient": "Kaas", 
    "Price": 2.5 
} 
]; 

Dies ist ein einfaches Beispiel dafür, was wie mein Array aussieht. Ich kann diese Struktur nicht ändern, so wie unsere API die Daten bereitstellt.

Was ich wirklich brauchen, ist diese Struktur:

[ 
{ 
    "CategoryName": "Prépare", 
    "Sandwiches": [ 
    { 
    "SandwichName": "Martino", 
    "Price": 3.1, 
    "Ingredients": ["Ansjovis", "Tabasco"] 
    } 
    ] 
}, 
{ 
    "CategoryName": "Veggie", 
    "Sandwiches": [ 
    { 
    "SandwichName": "Gezond", 
    "Price": 2.5, 
    "Ingredients": ["Tomaat", "Kaas"] 
    } 
    ] 
} 
] 

Ich habe versucht, ein paar Sachen mit Unterstrichen und _.groupBy, _.sortBy, _.countBy Aber leider nichts, was ich versucht habe tatsächlich funktioniert. Ist das überhaupt möglich mit Underscore (oder einer anderen Bibliothek)?

Auch auf einer Nebenbemerkung könnte dieses Beispiel einige JSON Strukturfehler haben, weil ich es selbst geschrieben habe. Die von der API bereitgestellten Daten haben ein korrektes Format.

Das Beispiel hat nur zwei Sandwiches, aber in Echtzeit, ich werde mehrere Kategorien mit jeweils 20 Sandwiches und so weiter abrufen. Dies ist nur ein minimiertes Beispiel, aber es gibt eine Vorstellung davon, was ich brauche.

Antwort

0

versuchen, dies in einfacher js

var map = {}; 
results.forEach(function(obj){ 
    map[ obj.CategoryName ] = map[ obj.CategoryName ] || []; 
    map[ obj.CategoryName ].push(obj); 
}); 

var output = Object.keys(map).map(function(key){ 
    var arr = []; 
    map[key].forEach(function(obj){ 
    arr.push({ 
     "SandwichName": obj.SandwichName, 
     "Price": obj.Price, 
     "Ingredients": obj.Ingredients 
    }); 
    }); 
    return { "CategoryName" : key , "Sandwiches" : arr }; 
}); 
+0

hat den Trick nicht. Habe ein Array mit allen Objekten, wie ich es bereits habe und alle Eigenschaften haben "undefined" als Wert. Das geht davon aus, dass 'objArray' das zu übergebende Array ist – Jorrex

+0

Was bekommen Sie in' output'? – gurvinder372

+0

Werfen Sie einen Blick auf: https://jsfiddle.net/Jorrex/ydkh8wdq/ – Jorrex

0

Das folgende Stück Code, den Trick für Sie tun würde:

var data = [...]; // this is your json-data 

var result = _.map(_.uniq(_.pluck(data, 'Category')), function(category) { 
    var sandwiches = _.uniq(_.pluck(_.where(data, { Category: category }), 'Sandwich')); 
    return { 
     CategoryName: category, 
     Sandwiches: _.map(sandwiches, function(sandwich) { 
      return { 
      SandwitchName: sandwich, 
      Price: _.findWhere(data, { Category: category, Sandwich: sandwich }).Price, 
      Ingredients: _.pluck(_.where(data, { Category: category, Sandwich: sandwich }), 'Ingredient') 
     }; 
     }) 
    }; 
});