如何从对象与数组字段生成新数组并过滤无对应薪资的职业
问题解决:过滤无匹配职业的薪资记录
原代码问题分析
原代码存在两个核心问题:
- 未使用块级作用域变量,导致找不到匹配职业时,会复用最后一次有效职业的薪资数据
- 无论职业是否匹配,都会强制将记录加入结果数组,不符合"无匹配则不加入"的需求
优化后的代码方案
方案一:使用filter + map组合(更直观)
const salaries = { TeamLead: { salary: 1000, tax: "99%" }, Architect: { salary: 9000, tax: "34%" }, Design: { salary: 3000, tax: "34%" }, }; const team = [ { name: "Alexander", specialization: "TeamLead" }, { name: "Gaudi", specialization: "Architect" }, { name: "Koolhas", specialization: "Architect" }, { name: "Foster", specialization: "Architect" }, { name: "Inna", specialization: "Design" }, { name: "John", specialization: "Design" }, { name: "Anna", specialization: "BackEnd" }, ]; // 先过滤出有薪资记录的员工,再生成对应薪资数据 const result = team .filter(worker => salaries.hasOwnProperty(worker.specialization)) .map(worker => { const { salary, tax } = salaries[worker.specialization]; // 保留原代码的薪资计算逻辑(薪资+税额),若需税后到手薪资可改为 salary * (100 - parseInt(tax)) / 100 const calculatedSalary = salary + (salary * parseInt(tax)) / 100; return { profession: worker.specialization, salary: calculatedSalary }; }); console.log(result);
方案二:使用reduce方法(一次遍历完成)
const salaries = { TeamLead: { salary: 1000, tax: "99%" }, Architect: { salary: 9000, tax: "34%" }, Design: { salary: 3000, tax: "34%" }, }; const team = [ { name: "Alexander", specialization: "TeamLead" }, { name: "Gaudi", specialization: "Architect" }, { name: "Koolhas", specialization: "Architect" }, { name: "Foster", specialization: "Architect" }, { name: "Inna", specialization: "Design" }, { name: "John", specialization: "Design" }, { name: "Anna", specialization: "BackEnd" }, ]; const result = team.reduce((acc, worker) => { const profession = worker.specialization; // 检查当前职业是否在薪资表中有记录 if (salaries.hasOwnProperty(profession)) { const { salary, tax } = salaries[profession]; const calculatedSalary = salary + (salary * parseInt(tax)) / 100; acc.push({ profession, salary: calculatedSalary }); } return acc; }, []); console.log(result);
关键改进说明
- 过滤无效记录:通过
hasOwnProperty判断职业是否存在于薪资表中,直接跳过无匹配的员工 - 变量作用域控制:所有变量均为块级作用域,避免全局变量污染导致的错误
- 逻辑简化:用数组高阶方法替代嵌套循环,代码可读性和执行效率更高
- 保留原有计算逻辑:若实际需求为"税后到手薪资",可将计算式改为
salary * (100 - parseInt(tax)) / 100
内容的提问来源于stack exchange,提问作者neoniy
相关产品推荐
相关产品推荐

