【问题标题】:How do we make this JS ES6+ Higher Order Function clean?我们如何使这个 JS ES6+ 高阶函数变得干净?
【发布时间】:2021-06-20 04:59:59
【问题描述】:

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

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

如果我使用了错误的术语或造成更多的混乱,我们深表歉意。 我仍在学习高阶函数,并试图将我的头脑围绕在函数内函数内的多层函数上。

感谢您的热心帮助。

const datasetEmployee = [
    {
        name: 'Person1',
        job: 'developer',
        salary: 1000
    },
    {
        name: 'Person2',
        job: 'developer',
        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));

强文本

【问题讨论】:

  • 我觉得很合理
  • 请注意,有关改进工作代码的问题应在Code Review 提出。
  • 感谢大家的热心和快速帮助。还将注意在 Code Review 上发布未来的工作代码。

标签: javascript coding-style higher-order-functions


【解决方案1】:

您可以在 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',
        job: 'developer',
        salary: 2000
    },
    {
        name: 'Person3',
        job: 'Job3',
        salary: 3000
    }
];


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 isDev = datasetEmployee.filter( (each) => each.job === 'developer');
const isNotDev = datasetEmployee.filter( (each) => each.job !== 'developer');


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

【讨论】:

    【解决方案2】:

    唯一需要改变的只是命名,否则就足够了。平均工资是做一件事——计算平均工资。否则它必须接收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, salary) => sum + salary, 0)
    }
    
    const averagePay = (employees) => {
        const numberOfEmployees = employees.length;
    
        return sumSalaries(employees) / numberOfWorkers ;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 2017-09-11
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多