Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

91
Vistas
Totalización de la matriz de valores de objetos usando reducer sin usar find

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);

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar

0

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);

about 4 years ago · Juan Pablo Isaza Denunciar

0

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; }

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda