我们如何让这个JS ES6+高阶函数变得干净



目前正在学习JS ES6+语法,我正在做一个关于开发者平均工资与非开发者平均工资的练习。代码是有效的,但根据我的理解,干净的代码是让一个函数只执行一项任务。目前,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));

强文本

您可以在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个参数并对它们进行划分,这基本上是无用的。

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函数的可能性之外,我没有看到太多的改进。

最新更新