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

如何使用reduce和动态键对对象属性求和?

实现指定键的对象数组求和方法

完全可以实现这个需求,以下是修正后的TypeScript实现代码:

const calculateTotals = <T extends object, K extends keyof T>(items: T[], ...keys: K[]) => {
  // 初始化结果对象,为每个传入的键设置初始值0
  const initialResult = keys.reduce((acc, key) => {
    acc[key] = 0;
    return acc;
  }, {} as { [P in K]: number });

  return items.reduce((result, item) => {
    // 仅遍历传入的目标键,累加对应属性值
    keys.forEach(key => {
      // 若属性值确定为数字类型,可移除类型断言;否则保留以兼容不同类型场景
      result[key] += (item[key] as unknown as number);
    });
    return result;
  }, initialResult);
};

关键说明

  1. 初始化结果对象:通过keys.reduce生成包含所有目标键、初始值为0的对象,同时通过类型断言让TypeScript正确推导结果类型。
  2. 定向累加:不再遍历对象所有属性,只处理传入的keys数组中的键,实现精准求和。
  3. 类型兼容:使用as unknown as number处理属性值可能非数字的场景;若业务中目标属性确定为数字类型,可直接移除该断言,或在泛型中限制T extends Record<K, number>来强化类型约束。

使用示例

const goods = [
  { id: 1, price: 25, count: 4 },
  { id: 2, price: 18, count: 2 },
  { id: 3, price: 30, count: 1 },
];

const sumResult = calculateTotals(goods, 'price', 'count');
console.log(sumResult); // 输出:{ price: 73, count: 7 }

可选优化(处理非数字值)

如果目标属性可能存在非数字值,可增加类型判断避免错误:

keys.forEach(key => {
  const value = item[key];
  if (typeof value === 'number') {
    result[key] += value;
  }
});

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:17:06