Reduce Array to Object Using Arrow Function

I'm playing around with the limits of array and arrow functions and I'm trying to convert this reduce function into an arrow function:

var monthsById = months.reduce(function(result, month) {
                            result[month.Id] = month;
                            return result;
                        }, {});

But I'm having trouble to return the map, since result[month.Id] = month; will return the month and not the map like in this approach:

var monthsById = months.reduce((byId, month) => byId[month.Id] = month, {});

So I'm looking for a single statement, that sets the value AND returns the object. (new Map() is not an option, since I need it in the regular {} format).

var months = [ { Id: 1 }, { Id: 2 }, { Id: 3 } ];

var monthsById = months.reduce((byId, month) => byId[month.Id] = month, {});

console.log(monthsById);

2 Answers

You can return byId in each iteration and wrap function body in parentheses ()

var months = [ { Id: 1 }, { Id: 2 }, { Id: 3 } ];

var monthsById = months.reduce((byId, month) => (byId[month.Id] = month, byId), {});
console.log(monthsById);
3

You could use Object.assign where you set a new property with computed property names and return the whole object.

var months = [{ Id: 1 }, { Id: 2 }, { Id: 3 }],
    monthsById = months.reduce((byId, month) => Object.assign(byId, { [month.Id]: month }), {});

console.log(monthsById);

An example with spreading.

var months = [{ Id: 1 }, { Id: 2 }, { Id: 3 }],
    monthsById = months.reduce((byId, month) => ({ ...byId, [month.Id]: month }), {});

console.log(monthsById);
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest