如何使用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); };
关键说明
- 初始化结果对象:通过
keys.reduce生成包含所有目标键、初始值为0的对象,同时通过类型断言让TypeScript正确推导结果类型。 - 定向累加:不再遍历对象所有属性,只处理传入的
keys数组中的键,实现精准求和。 - 类型兼容:使用
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
相关产品推荐
相关产品推荐

