简体   繁体   中英

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);

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);

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);

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM