如何优化JS ES6+高阶函数,实现平均薪资计算逻辑的简洁写法
解决方案
你对原代码的判断是准确的,原averagePay确实承担了三项独立任务:提取薪资数组、薪资求和、计算平均值。完全可以按照你的要求把所有逻辑封装在单个averagePay内部,不需要额外定义外部函数,甚至可以把你现在外部写的开发者/非开发者筛选逻辑也整合进去,进一步精简外部代码。
整合后代码示例
const datasetEmployee = [ { name: 'Person1', job: 'developer', salary: 1000 }, { name: 'Person2', job: 'developer', salary: 2000 }, { name: 'Person3', job: 'Job3', salary: 3000 } ]; // 所有逻辑封装在单个averagePay函数内,支持传入自定义筛选条件 const averagePay = (dataset, filterFn) => { // 三项任务的逻辑均以内部箭头函数实现,不污染外部作用域 return dataset .filter(filterFn) // 按传入条件筛选目标人群 .map(each => each.salary) // 提取薪资数组 .reduce((acc, curr, _, arr) => acc + curr / arr.length, 0); // 直接计算平均值,无需单独存储总和 }; // 调用时直接传入筛选规则即可,无需额外定义外部变量存储筛选结果 console.log(averagePay(datasetEmployee, each => each.job === 'developer')); // 输出1500 console.log(averagePay(datasetEmployee, each => each.job !== 'developer')); // 输出3000
补充说明
如果你需要严格拆分三项任务的独立匿名函数,更贴合「单一职责」要求,可以写成如下形式,三个小箭头函数均定义在averagePay内部,不会产生外部冗余定义:
const averagePay = (dataset, filterFn) => { // 每个内部函数仅承担一项任务 const getSalary = each => each.salary; // 任务1:提取单条数据的薪资 const calcAverage = (acc, curr, _, arr) => acc + curr / arr.length; // 任务2+3:累加薪资、计算平均值 return dataset.filter(filterFn).map(getSalary).reduce(calcAverage, 0); };
这种写法完全符合高阶函数的使用逻辑,所有辅助逻辑都封装在函数内部,同时满足了精简代码、无多余外部定义的需求。
内容的提问来源于stack exchange,提问作者Ii-
相关产品推荐
相关产品推荐

