如何在JavaScript中为Map设置默认值并正确统计团队各职业人数
修正团队职业统计函数的方案
我来帮你搞定这个统计职业人数的问题!先拆解下原来代码里的几个关键坑:
value变量没有绑定到每个职业的当前计数,导致自增逻辑完全混乱- 循环里额外的
i++会跳过一半团队成员,统计结果自然不对 - 用
some方法判断职业匹配的方式完全误用,它的返回逻辑和计数需求不搭
下面是修正后的函数,我会一步步解释关键改动:
const salaries = { Progger: {salary: 1000, tax: '15%'}, Tester: {salary: 800, tax: '10%'}, Manager: { salary: 1000, tax: '10%' }, Designer: { salary: 600, tax: '30%' }, Artist: { salary: 1500, tax: '15%' } }; const team = [ { name: 'Vasya', specialization: 'Tester' }, { name: 'Taras', specialization: 'Tester' }, { name: 'Taras I', specialization: 'Tester' }, { name: 'Tapas', specialization: 'Humor' }, { name: 'Misha', specialization: 'Manager' }, { name: 'Max', specialization: 'Designer' }, { name: 'Vova', specialization: 'Designer' }, { name: 'Leo', specialization: 'Artist' } ]; function calculateTeamFinanceReport(salaries, team) { // 1. 初始化Map,给salaries里的每个职业设置默认计数0 const professionCounts = new Map( Object.keys(salaries).map(prof => [prof, 0]) ); // 2. 遍历团队成员,统计匹配的职业 for (const member of team) { const spec = member.specialization; // 只统计在salaries里存在的职业 if (professionCounts.has(spec)) { // 获取当前计数并自增1,更新到Map里 professionCounts.set(spec, professionCounts.get(spec) + 1); } } return professionCounts; } // 测试结果:Tester => 3, Manager =>1, Designer=>2, Artist=>1, Progger=>0 console.log(calculateTeamFinanceReport(salaries, team));
关键改动说明:
- 初始化Map默认值:用
Object.keys(salaries).map()把每个职业转换成[职业名, 0]的数组,直接传给Map构造函数,一次性完成所有职业的默认计数初始化 - 正确遍历团队成员:用
for...of循环遍历team数组,避免手动操作索引导致的跳步问题 - 安全的计数自增:先通过
professionCounts.get(spec)获取当前职业的计数,加1后再用set更新Map,确保每次计数都是正确累加的 - 忽略不匹配的职业:通过
professionCounts.has(spec)判断,直接跳过不在salaries里的职业(比如示例中的'Humor')
这样修正后,函数就能返回正确的职业人数统计了:Tester有3人,Manager1人,Designer2人,Artist1人,Progger因为团队里没人从事该职业,所以计数为0。
内容的提问来源于stack exchange,提问作者Володимир К
相关产品推荐
相关产品推荐

