Given an array of objects with user data, merge the data combining the data of each user by adding their duration and equipment data. Equipment used must be merged without duplicates and then sorted in alphabetical order.
🔗 Data Merging 🟡 Medium 🧩 Pattern – Arrays & Objects
Related: Join Two Arrays by ID – 2722 | Matrixread
Example
[
{ user: 3, duration: 75, equipment: ['rowing machine'] },
{ user: 5, duration: 120, equipment: ['elliptical'] },
{ user: 4, duration: 30, equipment: ['jump rope'] },
{ user: 6, duration: 90, equipment: ['dumbbell', 'step'] },
{ user: 5, duration: 60, equipment: ['treadmill'] },
{ user: 9, duration: 180, equipment: ['stationary bike'] },
{ user: 3, duration: 45, equipment: ['medicine ball'] },
]
Code language: JavaScript (javascript)Solution
/**
* @param {Array<{user: number, duration: number, equipment: Array<string>}>} sessions
* @return {Array}
*/
export default function mergeData(sessions) {
// Map stores unique users.
const merged = new Map();
sessions.forEach(({ user, duration, equipment }) => {
if (merged.has(user)) {
let newData = merged.get(user);
newData.duration += duration;
// Set does not store duplicates.
newData.equipment = [...new Set([...equipment, ...newData.equipment])];
} else {
// Creating a new object to avoid modifying input.
merged.set(user, { user, duration, equipment });
}
});
// Creating an array from Map object and sort equipment before returning.
return Array.from(merged.values()).map(({ user, duration, equipment }) => ({
user,
duration,
equipment: Array.from(equipment).sort(),
}));
}Code language: JavaScript (javascript)