使用箭头函数将数组归约为对象的实现问题
解决Reduce箭头函数中赋值后返回对象的问题
嘿,这个问题我之前也碰到过!核心原因是赋值表达式的返回值是被赋的值——也就是你这里的month,所以reduce的回调每次都把month当成了新的累积器,自然达不到你想要的把所有月份按Id存入对象的结果。
要在一条语句里同时完成赋值并返回目标对象,你可以用JavaScript的逗号运算符,它会依次执行多个表达式,最终返回最后一个表达式的结果,刚好能满足你的需求:
const monthsById = yourMonthArray.reduce((result, month) => // 先执行赋值操作,再返回result对象 (result[month.Id] = month, result), {}); // 初始累积器为空白对象
原理说明:
- 逗号运算符会先执行
result[month.Id] = month完成键值对的赋值 - 随后返回逗号后方的
result,让reduce把这个对象作为下一次迭代的累积器 - 全程只操作同一个初始空对象,性能比每次创建新对象(比如用对象展开语法)要高效得多
如果你想写法更直观(虽然多了几行),也可以用大括号包裹并显式return:
const monthsById = yourMonthArray.reduce((result, month) => { result[month.Id] = month; return result; }, {});
不过既然你想要一条语句的简洁写法,逗号运算符的方案完全符合要求,还能保持箭头函数的紧凑风格。
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

