微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何使这个 JS ES6+ 高阶函数干净?

如何解决我们如何使这个 JS ES6+ 高阶函数干净?

目前正在学习 JS ES6+ 语法,并且正在做一个关于找到开发人员的平均工资与非开发人员的平均工资的练习。该代码正在运行,但根据我的理解,干净的代码一个函数只执行 1 个任务。目前,averagePay 有 3 个任务。

有没有办法使用箭头方法将这 3 个任务作为未命名函数提供给 averagePay,将它们全部包裹在一个 averagePay 中。我不想在外面创建太多的功能

如果我使用了错误的术语或造成更多混乱,我们深表歉意。 我仍在学习高阶函数,并试图在函数内的函数内的多层函数中进行思考。

感谢您的帮助。

const datasetEmployee = [
    {
        name: 'Person1',job: 'developer',salary: 1000
    },{
        name: 'Person2',salary: 2000
    },{
        name: 'Person3',job: 'Job3',salary: 3000
    }
];


const averagePay = (dataFiltered) => {

    const filteredSalary = dataFiltered.map( (each) => each.salary);
    const sumSalary = filteredSalary.reduce((acc,curr) => acc+curr,0);
    return sumSalary/filteredSalary.length;
}

const isDev = datasetEmployee.filter( (each) => each.job === 'developer');
const isNotDev = datasetEmployee.filter( (each) => each.job !== 'developer');


console.log(averagePay(isDev));
console.log(averagePay(isNotDev));

强文本

解决方法

您可以在 averagePay 函数内定义函数并使用它们。

const averagePay = (dataFiltered) => {
    const getSalaries = arr => arr.map(({salary}) => salary),getSum = arr => arr.reduce((a,b) => a + b,0)
    return getSum(getSalaries(dataFiltered)) / dataFiltered.length;
}

const datasetEmployee = [
    {
        name: 'Person1',job: 'developer',salary: 1000
    },{
        name: 'Person2',salary: 2000
    },{
        name: 'Person3',job: 'Job3',salary: 3000
    }
];


const averagePay = (dataFiltered) => {
    const getSalaries = arr => arr.map(({salary}) => salary),0)
    return getSum(getSalaries(dataFiltered)) / dataFiltered.length;
}

const isDev = datasetEmployee.filter( (each) => each.job === 'developer');
const isNotDev = datasetEmployee.filter( (each) => each.job !== 'developer');


console.log(averagePay(isDev));
console.log(averagePay(isNotDev));

,

唯一需要改变的可能只是命名,否则就足够了。平均工资只做一件事——计算平均工资。否则就得接收2个参数并进行除法,基本没用。

const averagePay = (employees) => {
    const numberOfEmployees = employees.length;
    const sumOfSalaries = employees.map(employee => employee.salary)
        .reduce((sum,salary) => sum + salary,0);

    return sumOfSalaries / numberOfWorkers ;
}

const developers = datasetEmployee.filter(employee  => employee .job === 'developer');
const nonDevelopers = datasetEmployee.filter(employee => employee.job !== 'developer');

你也可以这样做:

const sumSalaries = (employees) => {
    return employees.map(employee => employee.salary)
        .reduce((sum,0)
}

const averagePay = (employees) => {
    const numberOfEmployees = employees.length;

    return sumSalaries(employees) / numberOfWorkers ;
}

但除了可以重用 sum 函数之外,我没有看到太多改进。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。