Tengo una variedad de objetos como ese.
var orderResults = [{ id: '1', name: 'Maya Mahardhani', payment_amount : 100, sku: 'ST001802027', seq: '1' }, { id: '1', name: 'Maya Mahardhani', payment_amount : 50, sku: 'ST000703044', seq: '2' }, { id: '2', name: 'Tara Debu Batara', payment_amount : 100, sku: 'ST005101001', seq: '1' }, { id: '3', name: 'Nikita Gigir', payment_amount : 100, sku: 'ST004403030', seq: '1' }]Pero estoy tratando de extraer los datos de la siguiente manera.
[{ id: '1', name: 'Maya Mahardhani', total_amount : 150, sku_1: 'ST001802027', sku_2: 'ST000703044', }, { id: '2', name: 'Tara Debu Batara', total_amount : 100, sku_1: 'ST005101001' }, { id: '3', name: 'Nikita Gigir', total_amount : 100, sku_1: 'ST004403030' }] Le doy a probar con la función reduce de JavaScript. Pero sobrescribe la clave anterior con la anterior. Mi fragmento de código es así. Creo que estoy más cerca de resolver. Pero sigo buscando la ayuda.
orderResults.reduce((res, obj) => { res[obj.id] = { total_amount : (obj.id in res ? res[obj.id].total_amount : 0) + obj.payment_amount, name : obj.name, } res[obj.id]['sku' + obj.seq]= obj.sku return res; },[])Gracias
Creo que esto hará lo que estás tratando de hacer:
orderResults.reduce((res, obj, i) => { const existingIdx = res.findIndex(r => r.id === obj.id) if (existingIdx > -1) { res[existingIdx] = { ...res[existingIdx], total_amount : res[existingIdx].total_amount ? res[existingIdx].total_amount + obj.payment_amount : res[existingIdx].payment_amount + obj.payment_amount, name : obj.name, ['sku_' + obj.seq]: obj.sku } } else { res.push({ id: obj.id, name: obj.name, total_amount: obj.payment_amount, ['sku_' + obj.seq]: obj.sku }) } return res; },[])Tenga en cuenta que esta línea conservará el objeto original y sobrescribirá cualquier clave duplicada que se defina después:
...res[existingIdx],
También cuando su código ejecuta esta línea:
res[obj.id] = {
está configurando un índice específico en la matriz, lo que no creo que quieras hacer. Desea presionar (si la identificación del objeto aún no se ha agregado) o sobrescribir el objeto existente en el punto de inserción original cuando se creó el objeto con la misma identificación.
No cree un nuevo objeto cada vez.
const result = Object.values(orderResults.reduce((res, obj) => { res[obj.id] = res[obj.id] || { id: obj.id, total_amount : 0, name : obj.name, }; res[obj.id].total_amount += obj.total_amount; res[obj.id]['sku' + obj.seq] = obj.sku; return res; },[]))[{ id: '1', name: 'Maya Mahardhani', payment_amount: 100, sku: 'ST001802027', seq: '1' }, { id: '1', name: 'Maya Mahardhani', payment_amount: 50, sku: 'ST000703044', seq: '2' }, { id: '2', name: 'Tara Debu Batara', payment_amount: 100, sku: 'ST005101001', seq: '1' }, { id: '3', name: 'Nikita Gigir', payment_amount: 100, sku: 'ST004403030', seq: '1' }].reduce((acc, current) => { const { id, name, payment_amount, sku, seq } = current; const previousRecord = acc[id]; if (typeof previousRecord === 'object') { return { ...acc, [id]: { ...previousRecord, [`sku_${seq}`]: sku, total_amount: previousRecord.total_amount + payment_amount } } } else { return { ...acc, [id]: { id, name, [`sku_${seq}`]: sku, total_amount: payment_amount } } } }, {}) // returns an Object; use Object.values to convert to a list