我有:
const weekdays = eachDay.map((day) => format(day, 'EEE'));
let ret = { Su: '', Mo: '', Tu: '', We: '', Th: '', Fr: '', Sa: '' };
weekdays.forEach((day, index) => {
ret[Object.keys(ret)[index] as DaysOfWeekMui] = day;
});
我的一个队友说我可以使用
reduce
来避免预先定义 ret
。但我不确定他的意思。任何帮助将不胜感激。
提前致谢。
当我想将事物列表转换为单个事物时,我主要使用
reduce
。
因此,从您的示例中,您正在迭代
weekdays
的列表并将其变成一个对象。
要重写您现有的代码,您可以像这样使用 reduce:
const ret = weekdays.reduce((acc, day) => {
return { ...acc, [day.slice(0, 2)]: day }
}, /* initial value: */ {})
此代码将遍历您的工作日并调用 reduce 函数。该函数接收
acc
,这是最后一次迭代的结果(或第一次迭代中的初始值)以及您调用 reduce 的列表中的item
。
给定一个列表:
["Monday", "Tuesday"]
reduce
函数的结果将是:
{
Mo: "Monday",
Tu: "Tuesday"
}
Array#reduce
有两个参数:回调和初始值。在您的情况下,ret
将是您的初始值,您的代码可以这样重构:
const ret = weekdays.reduce((obj, day, index) => {
obj[obj.keys(obj)[index] as DaysOfWeekMui] = day
return obj
}, { Su: '', Mo: '', Tu: '', We: '', Th: '', Fr: '', Sa: '' })