JavaScript 怎么对后端接口返回的扁平数组进行分组与聚合统计

大芳姑娘_2795

大芳姑娘_2795

2026-09-05

934人浏览

原创

javascript对扁平数组分组聚合的核心是用reduce配合map/object,关键在明确分组依据和聚合逻辑:单字段计数、多字段组合键求和/平均、map支持对象等复杂key、封装通用函数提升复用,并注意数据清洗。

javascript 怎么对后端接口返回的扁平数组进行分组与聚合统计

JavaScript 对后端返回的扁平数组做分组与聚合统计,核心是用 reduce 或配合 Map / Object 构建分组结构,再对每组数据执行求和、计数、平均值等操作。关键不在“多复杂”,而在“分组依据”和“聚合逻辑”是否清晰。

按单个字段分组并统计数量

比如后端返回用户订单列表,想按 status(如 "paid"、"pending")统计各状态订单数:

const orders = [
  { id: 1, status: 'paid', amount: 99 },
  { id: 2, status: 'pending', amount: 45 },
  { id: 3, status: 'paid', amount: 120 }
];

const countByStatus = orders.reduce((acc, order) => {
  acc[order.status] = (acc[order.status] || 0) + 1;
  return acc;
}, {});

// 结果:{ paid: 2, pending: 1 }

按多个字段分组并聚合数值(如求和、平均)

若需按 category 和 year 分组,并统计总销售额和平均单价:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 先用组合键(如 `${cat}-${year}`)作为分组标识
  • 每组维护 sum、count、total 等中间状态
  • 最后可映射为更易读的结构(如数组或带元信息的对象)
const sales = [
  { category: 'book', year: 2023, price: 35 },
  { category: 'book', year: 2023, price: 42 },
  { category: 'tech', year: 2023, price: 89 }
];

const grouped = sales.reduce((acc, item) => {
  const key = `${item.category}-${item.year}`;
  if (!acc[key]) {
    acc[key] = { category: item.category, year: item.year, total: 0, count: 0 };
  }
  acc[key].total += item.price;
  acc[key].count += 1;
  return acc;
}, {});

// 转成数组并计算平均值
const result = Object.values(grouped).map(g => ({
  ...g,
  avg: Number((g.total / g.count).toFixed(2))
}));
// [{ category: 'book', year: 2023, total: 77, count: 2, avg: 38.5 }, ...]

用 Map 实现更安全的分组(支持任意类型 key)

当分组依据是对象、日期或 Symbol 时,普通对象 key 会自动转字符串,丢失信息。此时用 Map 更可靠:

const data = [
  { user: { id: 1, name: 'Alice' }, score: 85 },
  { user: { id: 1, name: 'Alice' }, score: 92 },
  { user: { id: 2, name: 'Bob' }, score: 76 }
];

const map = new Map();
data.forEach(item => {
  const { user, score } = item;
  if (!map.has(user)) {
    map.set(user, { user, sum: 0, count: 0 });
  }
  const group = map.get(user);
  group.sum += score;
  group.count += 1;
});

// 注意:Map 的 key 是引用相等,确保传入的是同一对象实例
// 否则需先序列化或自定义唯一标识(如 user.id)

封装通用分组聚合函数(提升复用性)

把重复逻辑抽成函数,支持灵活传入分组规则和聚合操作:

function groupAndAggregate(arr, getKey, aggregateFn) {
  return arr.reduce((acc, item) => {
    const key = typeof getKey === 'function' ? getKey(item) : item[getKey];
    if (!acc[key]) acc[key] = [];
    acc[key].push(item);
    return acc;
  }, {}).map((items, key) => ({
    key,
    items,
    ...aggregateFn(items)
  }));
}

// 使用示例:按 status 分组,统计数量和总金额
const result = groupAndAggregate(orders, 'status', items => ({
  count: items.length,
  totalAmount: items.reduce((sum, o) => sum + o.amount, 0)
}));

不复杂但容易忽略:后端返回的数据可能含空值、类型不一致(如 "2023" 字符串 vs 2023 数字),建议在分组前用 filter 清洗或用 ?? / || 提供默认值。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2083

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5590

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

4906

10

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4166

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1049

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4064

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

840

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1716

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3045

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习