如何在JavaScript中按指定职级汇总薪资数值?
按职级汇总薪资的实现方法
问题场景
执行console.log(changes)得到的对象集合如下:
{ "dt": "2022-07-01T00:00:00.000Z", "gradeName": "grade 3", "effectiveFrom": "2022-07-01T00:00:00.000Z", "salary": "10000.0000", "salaryEffective": "2022-07-01T00:00:00.000Z", "leaveDate": "2022-07-10T00:00:00.000Z", "dailyRate": "328.77" } { "dt": "2022-07-02T00:00:00.000Z", "gradeName": "grade 3", "effectiveFrom": "2022-07-01T00:00:00.000Z", "salary": "10000.0000", "salaryEffective": "2022-07-01T00:00:00.000Z", "leaveDate": "2022-07-10T00:00:00.000Z", "dailyRate": "328.77" }
需要按gradeName(职级)汇总薪资,但遍历对象时遇到问题,尝试的代码如下:
for (const [index, [key, value]] of Object.entries(Object.entries(changes))) { console.log(`${index}: ${key} = ${value}`); }
控制台输出不符合预期。
问题分析
你写的Object.entries(Object.entries(changes))逻辑错误,changes本质是对象数组(零散对象需先整理成数组),直接嵌套Object.entries会把数组的索引和元素拆分成多层键值对,导致遍历逻辑完全混乱。
正确实现方法
1. 规范数据结构
先确保changes是数组格式(如果输出的是零散对象,手动整理):
const changes = [ { "dt": "2022-07-01T00:00:00.000Z", "gradeName": "grade 3", "effectiveFrom": "2022-07-01T00:00:00.000Z", "salary": "10000.0000", "salaryEffective": "2022-07-01T00:00:00.000Z", "leaveDate": "2022-07-10T00:00:00.000Z", "dailyRate": "328.77" }, { "dt": "2022-07-02T00:00:00.000Z", "gradeName": "grade 3", "effectiveFrom": "2022-07-01T00:00:00.000Z", "salary": "10000.0000", "salaryEffective": "2022-07-01T00:00:00.000Z", "leaveDate": "2022-07-10T00:00:00.000Z", "dailyRate": "328.77" } ];
2. 基础遍历汇总写法
用for...of遍历数组,借助对象存储各职级的薪资总和:
// 初始化汇总容器 const salarySummary = {}; // 遍历每个数据对象 for (const item of changes) { // 提取职级,将字符串薪资转为数字 const grade = item.gradeName; const salary = parseFloat(item.salary); // 累加或初始化职级薪资 salarySummary[grade] = salarySummary[grade] ? salarySummary[grade] + salary : salary; } // 输出汇总结果 console.log(salarySummary); // 示例输出:{ "grade 3": 20000 }
3. 简化写法(reduce方法)
用数组reduce方法一步完成汇总:
const salarySummary = changes.reduce((acc, item) => { const grade = item.gradeName; const salary = parseFloat(item.salary); acc[grade] = (acc[grade] || 0) + salary; return acc; }, {}); console.log(salarySummary);
注意事项
salary字段是字符串类型,必须用parseFloat或Number()转为数字后才能进行数值计算- 若存在多个不同职级,代码会自动按
gradeName分别汇总
内容的提问来源于stack exchange,提问作者Bisoux
相关产品推荐
相关产品推荐

