
在现代前端应用开发中,尤其是在reactjs等框架中处理数据时,我们经常会遇到需要对数组中的对象进行分组和聚合计算的需求。这类似于关系型数据库中sql的sum和group by操作,即根据一个或多个键对数据进行分组,然后对每个组内的特定数值字段进行求和。
考虑以下一个包含项目信息的数组:
const frames = [
{
ProjectName: "Blue",
EmployeeGroup: false,
Amount: 50,
Hours: 15,
ProjectType: "Romeo",
},
{
ProjectName: "Red",
EmployeeGroup: false,
Amount: 20,
Hours: 5,
ProjectType: "Lima",
},
{
ProjectName: "Green",
EmployeeGroup: true,
Amount: 40,
Hours: 10,
ProjectType: "Lima",
}
];我们的目标是根据ProjectType对Amount和Hours进行求和,最终得到如下结构的数据:
[
{
ProjectType: "Lima",
TotalAmount: 60,
TotalHours: 15,
},
{
ProjectType: "Romeo",
TotalAmount: 50,
TotalHours: 15,
}
]直接使用array.filter和array.reduce组合虽然可以实现对单一ProjectType的求和,但如果需要对所有ProjectType进行聚合,这种方法会导致多次遍历和重复逻辑,效率较低且代码冗余。
为了高效地实现类似SQL GROUP BY和SUM的功能,我们可以采用一种常见的JavaScript模式:利用一个中间对象作为累加器,在一次遍历中完成分组和求和。
立即学习“Java免费学习笔记(深入)”;
const frames = [
{ ProjectName: "Blue", EmployeeGroup: false, Amount: 50, Hours: 15, ProjectType: "Romeo" },
{ ProjectName: "Red", EmployeeGroup: false, Amount: 20, Hours: 5, ProjectType: "Lima" },
{ ProjectName: "Green", EmployeeGroup: true, Amount: 40, Hours: 10, ProjectType: "Lima" }
];
const items = {}; // 初始化一个空对象作为中间累加器
// 使用 forEach 遍历原始数组
frames.forEach( ({ ProjectType, Amount, Hours }) => {
// 检查当前 ProjectType 是否已存在于累加器中
if (!items[ProjectType]) {
// 如果不存在,则为该 ProjectType 初始化一个新的聚合对象
items[ProjectType] = { ProjectType, TotalAmount: 0, TotalHours: 0 };
}
// 累加 Amount 和 Hours
items[ProjectType].TotalAmount += Amount;
items[ProjectType].TotalHours += Hours;
});
// 使用 Object.values() 将累加器对象转换为最终的数组结果
const output = Object.values(items);
console.log(output);
/*
输出结果:
[
{ ProjectType: 'Lima', TotalAmount: 60, TotalHours: 15 },
{ ProjectType: 'Romeo', TotalAmount: 50, TotalHours: 15 }
]
*/{
"Lima": { ProjectType: "Lima", TotalAmount: 60, TotalHours: 15 },
"Romeo": { ProjectType: "Romeo", TotalAmount: 50, TotalHours: 15 }
}Object.values()方法用于返回一个给定对象自身的所有可枚举属性值的数组,顺序与for...in循环给出的顺序一致。这样,我们就得到了期望的数组格式结果。
通过这种迭代加中间对象的策略,我们可以有效地在JavaScript中模拟SQL的GROUP BY和SUM操作,实现复杂的数据聚合需求,为前端应用的数据展示和分析提供强大的支持。
以上就是JavaScript/ReactJS中实现数组对象分组求和的SQL式聚合操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号