You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:10:30