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

如何在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));

但返回结果包含了员工姓名,不符合预期。我考虑过为每个职位创建数组筛选员工,但觉得应该有更简便的方法。

解决方案

你的代码问题出在两个地方:

  1. 不必要的键拼接:employee["doctor-receptionist"]这个属性根本不存在,拼接操作完全多余;
  2. 错误的结果存储:你把整个员工对象存入结果,还额外添加了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:05:25