如何在JavaScript中统计对象数组中职位属性的出现次数
统计员工职位出现次数的JavaScript实现
需求
现有员工数据数组:
var employees = [ { name: "Josh", title: "receptionist" }, { name: "Naila", title: "receptionist" }, { name: "Tom", title: "doctor" }, { name: "Becky", title: "doctor" } ];
需要统计每个职位的出现次数,最终得到:
{ 'doctor': 2, 'receptionist': 2 }
问题描述
我尝试了这段代码:
const convert = (employees) => { const res = {}; employees.forEach((employee) => { const key = `${employee.title}${employee["doctor-receptionist"]}`; if (!res[key]) { res[key] = {...employee, count: 0 }; }; res[key].count += 1; }); return Object.values(res); }; console.log(convert(employees));
但返回结果包含了员工姓名,不符合预期。我考虑过为每个职位创建数组筛选员工,但觉得应该有更简便的方法。
解决方案
你的代码问题出在两个地方:
- 不必要的键拼接:
employee["doctor-receptionist"]这个属性根本不存在,拼接操作完全多余; - 错误的结果存储:你把整个员工对象存入结果,还额外添加了
count属性,最后返回对象值数组,和预期的{职位:次数}结构不符。
下面是两种简洁的实现方式:
方式1:forEach遍历统计
const convert = (employees) => { const countObj = {}; employees.forEach(emp => { // 若当前职位未统计过,初始化为0,否则直接累加计数 countObj[emp.title] = (countObj[emp.title] || 0) + 1; }); return countObj; };
方式2:reduce累加(更简洁)
reduce天生适合这类累加统计场景,只需一次遍历即可完成:
const convert = (employees) => { return employees.reduce((acc, emp) => { acc[emp.title] = (acc[emp.title] || 0) + 1; return acc; }, {}); // 初始值设为空对象 };
两种方法都能直接输出你想要的结果,时间复杂度都是O(n),比创建数组筛选的方法高效很多。
内容的提问来源于stack exchange,提问作者user20445025
相关产品推荐
相关产品推荐

