Merge an object and summarize a single javascript property

I have an array like this

[ { item_guid: "57e7a1cd6a3f3669dc03db58" quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5" quantity:3 }, { item_guid: "57e7a1cd6a3f3669dc03db58" quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5" quantity:3 } ] 

What I want from this is to merge a similar item_guid into one object and quantity, thus summing up

 [ { item_guid: "57e7a1cd6a3f3669dc03db58" quantity:6 }, { item_guid: "57e77b06e0566d496b51fed5" quantity:6 } ] 

I know this can be achieved in some kind of cycle, instead I am looking for solutions that use lodash or EcmaScript2015 code to make our life easier.

+6
source share
4 answers

Simple approach:

Loop the data and create an object where the key will be a unique identifier, and its value will be the quantity. Then go back to the object keys and create the objects.

 var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }] var r = {}; data.forEach(function(o){ r[o.item_guid] = (r[o.item_guid] || 0) + o.quantity; }) var result = Object.keys(r).map(function(k){ return { item_guid: k, quantity: r[k] } }); console.log(result) 

+5
source

The solution is in simple Javascript with a hash table for item_guid .

 var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }], grouped = data.reduce(function (hash) { return function (r, a) { (hash[a.item_guid] = hash[a.item_guid] || r[r.push({ item_guid: a.item_guid, quantity: 0 }) - 1]).quantity += a.quantity; return r; }; }(Object.create(null)), []); console.log(grouped); 

ES6

 var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }], grouped = data.reduce((map => (r, a) => { map.set(a.item_guid, map.get(a.item_guid) || r[r.push({ item_guid: a.item_guid, quantity: 0 }) - 1]); map.get(a.item_guid).quantity += a.quantity; return r; })(new Map), []); console.log(grouped); 
+2
source

You can

  • group your objects with item_guid
  • summarize objects in result groups
  • convert these groups to the desired format.

Something like that:

 var result = _.chain(data) .groupBy('item_guid') .map(function(objects, guid) { return { item_guid: guid, quantity: _.sumBy(objects, 'quantity') }; }) .value(); 

And demo

 var data = [ { item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity:3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity:3 } ]; var result = _.chain(data) .groupBy('item_guid') .map(function(objects, guid) { return { item_guid: guid, quantity: _.sumBy(objects, 'quantity') }; }) .value(); console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script> 
+1
source
 var groupedItems = []; var totalItems = [{item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3},{item_guid: "57e77b06e0566d496b51fed5",quantity:3}, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity:3}]; totalItems.forEach((e) => { if (groupedItems.findIndex(x => x.item_guid === e.item_guid) < 0) { let totalQuantity = totalItems .filter(x => x.item_guid === e.item_guid) .map(x => x.quantity) .reduce(function(a, b) { return a + b;}); groupedItems.push({item_guid: e.item_guid, quantity: totalQuantity}) } }) console.log(groupedItems); 
0
source

Source: https://habr.com/ru/post/1258823/


All Articles