使用箭头函数将数组缩减为对象

Bas*_*sti 3 javascript arrays javascript-objects arrow-functions

我正在尝试使用数组和箭头函数的限制,并尝试将此 reduce 函数转换为箭头函数:

var monthsById = months.reduce(function(result, month) {
                            result[month.Id] = month;
                            return result;
                        }, {});
Run Code Online (Sandbox Code Playgroud)

但是我无法返回地图,因为result[month.Id] = month;将返回月份而不是像这种方法中的地图:

var monthsById = months.reduce((byId, month) => byId[month.Id] = month, {});
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找一个单一的语句,它设置值并返回对象。(new Map()不是一个选项,因为我需要它的常规{}格式)。

var monthsById = months.reduce(function(result, month) {
                            result[month.Id] = month;
                            return result;
                        }, {});
Run Code Online (Sandbox Code Playgroud)

Nen*_*car 8

您可以byId在每次迭代中返回并将函数体包装在括号中()

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

var monthsById = months.reduce((byId, month) => (byId[month.Id] = month, byId), {});
console.log(monthsById);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以使用Object.assignwhere 设置具有计算属性名称的新属性并返回整个对象。

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

console.log(monthsById);
Run Code Online (Sandbox Code Playgroud)

一个传播的例子。

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

console.log(monthsById);
Run Code Online (Sandbox Code Playgroud)