2016-04-13 11 views
0

Hallo Ich habe eine Sammlung zurückgegeben, wie JSON wie folgt aus:Gruppe ähnliche Artikel in JSON

[ 
{ 
    "quantity": "1", 
    "description": "VIP Ticket to Event" 
}, 
{ 
    "quantity": "1", 
    "description": "VIP Ticket to Event" 
}, 
{ 
    "quantity": "1", 
    "description": "VIP Ticket to Event" 
}, 
{ 
    "quantity": "1", 
    "description": "Regular Ticket to Event" 
}, 
{ 
    "quantity": "1", 
    "description": "Regular Ticket to Event" 
}, 
] 

Allerdings würde ich die ähnlichen Einzelteile zusammen zu gruppieren wie so am Ende hat ich diese:

[ 
{ 
    "quantity": "3", 
    "description": "VIP Tickets to Event" 
}, 
{ 
    "quantity": "2", 
    "description": "Regular Tickets to Event" 
} 
] 

Es ist ziemlich bedauerlich, aber ich kann die Datenbankstruktur nicht ändern, so dass ich nur mit den Ergebnissen herumspielen kann. Was wäre ein guter und effizienter Weg, um diese Art von Gruppierung zu machen?

Dies ist als Laravel und Javascript getaggt, weil ich die gleiche Lösung für meine Front als auch anwenden müssen.

+0

der JSON wird generiert? –

Antwort

0

Sie können reduce verwenden, um ein neues Array mit der aktualisierten Struktur zu schaffen - gruppierte nach description

var grouped = arr.reduce(function(groups, current) { 
    var found = false; 
    for (var i = 0; i < groups.length; i++) { 
     if (groups[i].description == current.description) { 
      groups[i].quantity++; 
      found = true; 
     } 
    } 

    if (!found) { 
     groups.push(current); 
    } 

    return groups; 
}, []); 
0

Dies ist ein Vorschlag mit einem temporären Objekt für die Referenz auf das Objekt mit der gleichen Beschreibung.

var array = [{ "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "Regular Ticket to Event" }, { "quantity": "1", "description": "Regular Ticket to Event" }, ], 
 
    grouped = []; 
 

 
array.forEach(function (a) { 
 
    if (!this[a.description]) { 
 
     this[a.description] = { description: a.description, quantity: 0 }; 
 
     grouped.push(this[a.description]); 
 
    } 
 
    this[a.description].quantity += +a.quantity; 
 
}, {}); 
 

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

0

Mit temporärem Objekt

var d = [{ "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "VIP Ticket to Event" }, { "quantity": "1", "description": "Regular Ticket to Event" }, { "quantity": "1", "description": "Regular Ticket to Event" }]; 
 

 
var o = {}; 
 

 
d.forEach(e => o[e.description] = o[e.description] + +e.quantity || +e.quantity); 
 

 
var r = Object.keys(o).map(e => ({ quantity: o[e], description: e })); 
 
    
 
document.write('<pre> ' + JSON.stringify(r, 0, 2) + '</pre>');;

0

Eine andere Art von reduce wo Sie müssen nicht für jedes Element über das Gruppe-Array iterieren in Eingabe-Array, um nach vorhandenen zu suchen.

den reduzierten Wert mit sich selbst als Hashmap für doppelte

var groupedItemsObj = items.reduce(function(previous, next){ 
    if(previous[next.description]){ 
     var updatedQuantity = previous[next.description].quantity + next.quantity; 
     previous[next.description] = {quantity: updatedQuantity, description: next.description}; 
    }else{ 
     previous[next.description] = next; 
    } 
    return previous; 
}, {}); 

Und schließlich map das reduzierte Objekt Array konvertieren mit zu überprüfen.

var groupedItemsArray = Object.keys(groupedItemsObj).map(function(key){ 
    return groupedItemsObj[key]; 
}); 

prüfen ist Arbeits here. Ich habe die Anzahl auf Nummer geändert. Änderte auch ein paar Werte in 2, um zu zeigen, dass es richtig funktioniert.

Verwandte Themen