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

如何从对象与数组字段生成新数组并过滤无对应薪资的职业

问题解决:过滤无匹配职业的薪资记录

原代码问题分析

原代码存在两个核心问题:

  • 未使用块级作用域变量,导致找不到匹配职业时,会复用最后一次有效职业的薪资数据
  • 无论职业是否匹配,都会强制将记录加入结果数组,不符合"无匹配则不加入"的需求

优化后的代码方案

方案一:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:20:41