如何在reduce函数中添加属性?含硬编码与数据源取值场景
为对象添加newProp属性的两种实现方案
背景
现有JavaScript代码:
source.map(data => /*tslint:disable:no-string-literal*/ Object['values']( data.reduce( (acc, { name, type, count }) => (((acc[name] = acc[name] || { name })[type] = count), acc), {}, ), ), ),
输出结构:
{ "name": "name1", "type": "type1", "size": 2, "total": 4 }
下面针对两种需求分别给出实现方案:
场景1:硬编码添加固定值的newProp
直接在初始化name对应的对象时,加入硬编码的newProp属性即可:
可读性优先的写法
source.map(data => /*tslint:disable:no-string-literal*/ Object['values']( data.reduce( (acc, { name, type, count }) => { const item = acc[name] = acc[name] || { name, newProp: 'value' }; item[type] = count; return acc; }, {}, ), ), ),
保持原逗号表达式风格
source.map(data => /*tslint:disable:no-string-literal*/ Object['values']( data.reduce( (acc, { name, type, count }) => (((acc[name] = acc[name] || { name, newProp: 'value' })[type] = count), acc), {}, ), ), ),
修改后每个输出对象都会带上"newProp": "value"。
场景2:从source数据项中获取newProp的值
在reduce循环中,为每个name对应的对象赋值从当前数据项中解构出的newProp。如果同一个name对应多个数据项,最终会保留最后一次处理的newProp值:
可读性优先的写法
source.map(data => /*tslint:disable:no-string-literal*/ Object['values']( data.reduce( (acc, { name, type, count, newProp }) => { const item = acc[name] = acc[name] || { name }; item[type] = count; item.newProp = newProp; return acc; }, {}, ), ), ),
保持原逗号表达式风格
source.map(data => /*tslint:disable:no-string-literal*/ Object['values']( data.reduce( (acc, { name, type, count, newProp }) => (((acc[name] = acc[name] || { name })[type] = count), (acc[name].newProp = newProp), acc), {}, ), ), ),
内容的提问来源于stack exchange,提问作者Sergino
相关产品推荐
相关产品推荐

