Estoy tratando de formatear algunos datos para actualizar por lotes usando la API REST de Woocommerce.
Formato de matriz de destino:
update: [ { id: 1, app: 'string1string2string3' }, { id: 2, app: 'string2' }, { id: 3, app: 'string2' }, { id: 5, app: 'string2' } ]Ejemplo reproducible
arr1 = [{ id: 1, app: 'string1' }, { id: 1, app: 'string2' }, { id: 1, app: 'string3' }, { id: 2, app: 'string2' }, { id: 3, app: 'string2' }, { id: 5, app: 'string2' }]; let a = new Map(); arr1.forEach((e) => { if (a.get(e.id)) { a.get(e.id).app += e.app; } else { a.set(e.id, e) } }) const finalizado = Array.from(a) console.log(finalizado); var temporary, chunk = 100; for (let i = 0; i < finalizado.length; i += chunk) { temporary = finalizado.slice(i, i + chunk); var payloadUp = { update: temporary }; console.log(payloadUp); }Este es un ejemplo reproducible, mi primer intento fue simplemente formar una matriz desde el mapa:
const finalizado = Array.from(a)Eso no funcionó, entonces traté de darle algún formato:
const finalizado = Array.from(a, [key, value] => { return ([key]: value); }Pero creo que estoy fuera de mi alcance, no puedo entender el formato.
Solución
Use reduce() y Object.values() para establecer una matriz de destino como desee:
arr1 = [{ id: 1, app: 'string1' }, { id: 1, app: 'string2' }, { id: 1, app: 'string3' }, { id: 2, app: 'string2' }, { id: 3, app: 'string2' }, { id: 5, app: 'string2' }]; const arrayHashmap = arr1.reduce((obj, item) => { obj[item.id] ? obj[item.id].app = obj[item.id].app.concat(item.app) : (obj[item.id] = { ...item }); return obj; }, {}); const mergedArray = Object.values(arrayHashmap); console.log(mergedArray);