Estoy reduciendo la matriz de data a una entrada por DishName con los valores Qty, Cooked y NotCooked agregados si los DishNames son los mismos.
Lo que tengo funciona, sin embargo, debido a la necesidad de compatibilidad con dispositivos antiguos, no puedo usar .find() con "flechas gruesas". He intentado devanarme los sesos pero no puedo encontrar una solución.
var data = [ { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '38. King Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: 'Chicken Tikka Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, ]; var res = data.reduce(function(acc, obj) { var existItem = acc.find(item => item.DishName === obj.DishName); if (existItem) { existItem.Qty += obj.Qty; existItem.Cooked += obj.Cooked; existItem.NotCooked += obj.NotCooked; return acc; } acc.push(obj); return acc; }, []); console.log(res);La var existItem = acc.find(item => item.DishName === obj.DishName); se puede reescribir sin función de flecha como
var existItem = acc.find(function(item){return item.DishName === obj.DishName;}); O si quiere evitar usar find como
var existItem = acc.filter(function(item){return item.DishName === obj.DishName;})[0]; Pero también cambiaría acc.push(obj); a acc.push({...obj}); para evitar mutar la matriz data original.
Las funciones de flecha son ligeramente diferentes a las funciones regulares pero son muy similares. En su caso, puede usar find con una función regular.
var data = [ {DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0}, {DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0}, {DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0}, {DishName: '38. King Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0}, {DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1}, {DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1}, {DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1}, {DishName: 'Chicken Tikka Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1}, ] var res = data.reduce(function(acc, obj) { var existItem = acc.find(function(item){return item.DishName === obj.DishName}); if (existItem) { existItem.Qty += obj.Qty; existItem.Cooked += obj.Cooked; existItem.NotCooked += obj.NotCooked; return acc; } acc.push(obj); return acc; }, []); console.log(res);Un enfoque sin find tiene la ventaja adicional de ahorrar para cada paso de un ciclo de reduce completo la iteración de find innecesaria.
Una solución basada en un acumulador que se encarga de mapear y recopilar elementos de plato no fusionados ejecuta un solo ciclo de reduce .
function mergeSameDish(collector, item) { var index = collector.index; var list = collector.list; var merger = index[item.DishName]; if (merger) { // a (to be) merged dish item. merger.Qty = merger.Qty + item.Qty; merger.Cooked = merger.Cooked + item.Cooked; merger.NotCooked = merger.NotCooked + item.NotCooked; } else { // collect and map a shallow dish item copy // in order to not later mutate the original. list.push( index[item.DishName] = Object.assign({}, item) ); } return collector; } var data = [ { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '38. King Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: 'Chicken Tikka Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, ]; console.log( 'mutated/reduced items ...', data.reduce(mergeSameDish, { index: {}, list: [], }).list ); console.log('unchanged/original items ... ', data); .as-console-wrapper { min-height: 100%!important; top: 0; }