Tengo una matriz como esta:
[ { "orderId": 1, "orderDate": "2021-04-28T08:20:58Z", "status": "Confirmed", "sellerName": "Chris Gilmour", "revenue": 2316.49 }, { "orderId": 2, "orderDate": "2020-12-19T12:30:18Z", "status": "Confirmed", "sellerName": "Alanna Sumner", "revenue": 2928.88 }, { "orderId": 4, "orderDate": "2020-12-24T08:00:09Z", "status": "Confirmed", "sellerName": "Beth North", "revenue": 1550.19 }, { "orderId": 5, "orderDate": "2021-06-06T04:40:48Z", "status": "Confirmed", "sellerName": "Laura Ponce", "revenue": 35.5 }, { "orderId": 8, "orderDate": "2021-08-27T05:13:40Z", "status": "Canceled", "sellerName": "Blade Newman", "revenue": 2957.29 }, { "orderId": 9, "orderDate": "2020-12-26T08:07:57Z", "status": "Confirmed", "sellerName": "Alanna Sumner", "revenue": 2164.75 }, { "orderId": 10, "orderDate": "2021-04-23T18:44:19Z", "status": "Confirmed", "sellerName": "Blade Newman", "revenue": 2287.55 } ]Quiero que la nueva matriz sea:
[ { "sellerName": "Blade Newman", "totalRevenue": 5244.84 }, { "sellerName": "Alanna Sumner", "totalRevenue": 5093.63 }, { "sellerName": "Chris Gilmour", "totalRevenue" : 2316.49 }, { "sellerName": "Beth North", "totalRevenue": 1550.19 } ]Así que quiero que la matriz se agrupe por nombre del vendedor, la cantidad vendida resumida y ordenada por los vendedores con la mayor cantidad de ventas totales.
Traté de resolver esto usando forEachs y reduce, pero fallé, si alguien puede ayudarme, sería genial.
Gracias por adelantado.
Como lo describe @CarySwoveland en los comentarios, puede acumular ingresos para cada vendedor en un objeto, convertir las entradas del objeto en una matriz para ordenar y luego generar un nuevo objeto basado en los valores ordenados:
const sales = [{ "orderId": 1, "orderDate": "2021-04-28T08:20:58Z", "status": "Confirmed", "sellerName": "Chris Gilmour", "revenue": 2316.49 }, { "orderId": 2, "orderDate": "2020-12-19T12:30:18Z", "status": "Confirmed", "sellerName": "Alanna Sumner", "revenue": 2928.88 }, { "orderId": 4, "orderDate": "2020-12-24T08:00:09Z", "status": "Confirmed", "sellerName": "Beth North", "revenue": 1550.19 }, { "orderId": 5, "orderDate": "2021-06-06T04:40:48Z", "status": "Confirmed", "sellerName": "Laura Ponce", "revenue": 35.5 }, { "orderId": 8, "orderDate": "2021-08-27T05:13:40Z", "status": "Canceled", "sellerName": "Blade Newman", "revenue": 2957.29 }, { "orderId": 9, "orderDate": "2020-12-26T08:07:57Z", "status": "Confirmed", "sellerName": "Alanna Sumner", "revenue": 2164.75 }, { "orderId": 10, "orderDate": "2021-04-23T18:44:19Z", "status": "Confirmed", "sellerName": "Blade Newman", "revenue": 2287.55 } ]; let totalsales = sales.reduce((acc, { sellerName, revenue }) => { acc[sellerName] = (acc[sellerName] || 0) + revenue; return acc; }, {}); totalsales = Object.entries(totalsales) .sort((a, b) => b[1] - a[1]) .map((v) => ({ sellerName: v[0], totalRevenue: v[1] })) console.log(totalsales)Puedes probar esto:
const newArray=[]; for (var order of orders) { var index = newArray.findIndex((a)=>a.sellerName==order.sellerName); if (index>-1){ newArray[index].totalRevenue+=order.revenue; } else { newArray.push({ sellerName: order.sellerName, totalRevenue: order.revenue }) } } newArray.sort((a,b)=>b.totalRevenue-a.totalRevenue);La misma técnica que en otras respuestas, pero doblada en una sola función:
const total = (sales) => Object .entries (sales .reduce ( (a, {sellerName: n, revenue}) => ({...a, [n] : (a[n] ?? 0) + revenue}), {} )) .map (([sellerName, totalRevenue]) => ({sellerName, totalRevenue})) const sales = [{orderId: 1, orderDate: "2021-04-28T08: 20: 58Z", status: "Confirmed", sellerName: "Chris Gilmour", revenue: 2316.49}, {orderId: 2, orderDate: "2020-12-19T12: 30: 18Z", status: "Confirmed", sellerName: "Alanna Sumner", revenue: 2928.88}, {orderId: 4, orderDate: "2020-12-24T08: 00: 09Z", status: "Confirmed", sellerName: "Beth North", revenue: 1550.19}, {orderId: 5, orderDate: "2021-06-06T04: 40: 48Z", status: "Confirmed", sellerName: "Laura Ponce", revenue: 35.5}, {orderId: 8, orderDate: "2021-08-27T05: 13: 40Z", status: "Canceled", sellerName: "Blade Newman", revenue: 2957.29}, {orderId: 9, orderDate: "2020-12-26T08: 07: 57Z", status: "Confirmed", sellerName: "Alanna Sumner", revenue: 2164.75}, {orderId: 10, orderDate: "2021-04-23T18: 44: 19Z", status: "Confirmed", sellerName: "Blade Newman", revenue: 2287.55}] console .log (total (sales)) .as-console-wrapper {max-height: 100% !important; top: 0} Usando reduce , obtenemos este formato intermedio:
{ "Chris Gilmour": 2316.49, "Alanna Sumner": 5093.63, "Beth North": 1550.19, "Laura Ponce": 35.5, "Blade Newman": 5244.84 } Entonces Object .entries lo convierte en
[ ["Chris Gilmour", 2316.49], ["Alanna Sumner", 5093.63], ["Beth North", 1550.19], ["Laura Ponce", 35.5], ["Blade Newman", 5244.84] ] y la llamada de map lo convierte en su forma final.