I'm trying to format some data to batch update using Woocommerce REST API.
Target array format:
update: [
{
id: 1,
app: 'string1string2string3'
},
{
id: 2,
app: 'string2'
},
{
id: 3,
app: 'string2'
},
{
id: 5,
app: 'string2'
}
]
Reproducible example
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); }
This is a reproducible example, my first try was to just form an Array from the Map:
const finalizado = Array.from(a)
That didn't work, then I tried to give it some format:
const finalizado = Array.from(a, [key, value] => {
return ([key]: value);
}
But I'm out of my depth I think, I can't get my head around the formatting.
Solution
Use reduce()
and Object.values()
can set a target array like you want:
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);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.