TypeScript中实现JSON数据按Host聚合:Task维度ProcessCount统计
在TypeScript中按host和task聚合processCount的实现方案
下面提供两种可行的实现方式,一种是原生JavaScript/TypeScript的reduce方法,另一种是借助Lodash库简化逻辑。
原生reduce实现
无需额外依赖,通过数组reduce方法即可完成聚合,逻辑清晰可控:
// 定义原始数据类型 interface RawRecord { record: string; host: string; task: string; taskCount: string; processCount: number; } // 定义聚合结果类型 interface AggregatedResult { host: string; [task: string]: { processCount: number }; } const rawData: RawRecord[] = [ { "record": "1", "host": "a", "task": "AMQPCSEA", "taskCount": "1", "processCount": 1 }, { "record": "2", "host": "a", "task": "MANAGER", "taskCount": "1", "processCount": 1 }, { "record": "3", "host": "a", "task": "AMQFQPUB", "taskCount": "1", "processCount": 1 }, { "record": "4", "host": "b", "task": "AMQPCSEA", "taskCount": "1", "processCount": 2 }, { "record": "5", "host": "a", "task": "MANAGER", "taskCount": "1", "processCount": 1 } ]; // 执行聚合 const aggregatedResult = Object.values(rawData.reduce((acc, current) => { // 初始化当前host的条目 if (!acc[current.host]) { acc[current.host] = { host: current.host } as AggregatedResult; } const hostEntry = acc[current.host]; // 累加当前task的processCount if (hostEntry[current.task]) { hostEntry[current.task].processCount += current.processCount; } else { hostEntry[current.task] = { processCount: current.processCount }; } return acc; }, {} as Record<string, AggregatedResult>)); console.log(aggregatedResult);
逻辑说明
- 用
reduce构建临时对象,key为host,value是该host对应的聚合条目 - 遍历每条原始记录时,先确保当前host的条目已初始化
- 针对每个task,要么初始化
processCount为当前值,要么累加现有值 - 最后用
Object.values将临时对象转为目标数组格式
借助Lodash简化实现
如果希望减少手写逻辑,可以使用Lodash的分组和聚合工具函数:
首先安装依赖:
npm install lodash @types/lodash
然后实现代码:
import { groupBy, mapValues, sumBy } from 'lodash'; // 复用前面定义的RawRecord类型和rawData数据 // 第一步:按host分组 const groupedByHost = groupBy(rawData, 'host'); // 第二步:处理每个host的分组数据,聚合task的processCount const aggregatedResult = Object.entries(groupedByHost).map(([host, records]) => { // 按task分组,并计算每个task的processCount总和 const taskAggregates = mapValues(groupBy(records, 'task'), taskRecords => ({ processCount: sumBy(taskRecords, 'processCount') })); // 合并host信息和task聚合结果 return { host, ...taskAggregates }; }); console.log(aggregatedResult);
逻辑说明
- 先用
groupBy将原始数据按host分组 - 对每个host下的记录再次按task分组,用
sumBy计算每个task的processCount总和 - 最后将host字段与聚合后的task数据合并为对象,组成最终数组
内容的提问来源于stack exchange,提问作者sbernardy
相关产品推荐
相关产品推荐

