如何在JavaScript的reduce回调中一行设置对象属性并返回对象?
如何合并reduce回调中的两行代码
你可以通过逗号运算符把赋值和返回操作合并成一行,结合箭头函数的简洁语法实现,完全保留原代码的逻辑:
const arr = [{name: 'fred', age: 20}, {name: 'john', age: 50}] const result = arr.reduce((acc, item) => (acc[item.name] = item.age, acc), {}) console.log(result) // 输出:{ fred: 20, john: 50 }
为什么这样可行?
- 逗号运算符会按顺序执行所有表达式,最终返回最后一个表达式的结果
- 用括号包裹整个表达式,是为了让箭头函数将其识别为返回值(如果不加括号,箭头函数会把逗号前的内容当成函数体语句,无法正确返回acc)
如果需要保持不可变操作(不直接修改累加器对象),也可以用Object.assign或对象展开语法实现一行写法,但这两种方式会每次创建新对象,和原代码修改原累加器的行为不同:
用Object.assign的写法:
const result = arr.reduce((acc, item) => Object.assign(acc, { [item.name]: item.age }), {})
用ES6对象展开的写法:
const result = arr.reduce((acc, item) => ({ ...acc, [item.name]: item.age }), {})
内容的提问来源于stack exchange,提问作者danday74
相关产品推荐
相关产品推荐

