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

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);

逻辑说明

  1. 用reduce构建临时对象,key为host,value是该host对应的聚合条目
  2. 遍历每条原始记录时,先确保当前host的条目已初始化
  3. 针对每个task,要么初始化processCount为当前值,要么累加现有值
  4. 最后用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);

逻辑说明

  1. 先用groupBy将原始数据按host分组
  2. 对每个host下的记录再次按task分组,用sumBy计算每个task的processCount总和
  3. 最后将host字段与聚合后的task数据合并为对象,组成最终数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:58