Вам не нужно изменять getAverage
- вы можете предварительно обработать массив перед его передачей, в этом случае getAverage
будет работать именно так, как нужно:
var people = [
{
name: 'Anna',
age: 22
},
{
name: 'Tom',
age: 34
}, {
name: 'John',
age: 12
},
]
let getAverage = arr => {
let reducer = (total, currentValue) => total + currentValue;
let sum = arr.reduce(reducer)
return sum / arr.length;
}
let ages = people.map(person => person.age);
console.log(getAverage(ages));
Если вы хотите изменить getAverage
, чтобы он мог обрабатывать любой потенциальный тип ввода, тогда вы можете добавить необязательный аргумент, который будет выполнять извлечение значения, поэтому вы не сможетене нужно запускать map
для каждого массива.
var numbers = [
1,
2,
3,
4,
5
]
var people = [
{
name: 'Anna',
age: 22
},
{
name: 'Tom',
age: 34
}, {
name: 'John',
age: 12
},
]
var moreComplexObjects = [
{
a: {
b: {
c: 6
}
}
},
{
a: {
b: {
c: 7
}
}
},
{
a: {
b: {
c: 8
}
}
}
]
//the default value of the second parameter is a function that returns the input
let getAverage = (arr, valueExtractor = x => x) => {
//extract the value of each element
let reducer = (total, currentValue) => total + valueExtractor(currentValue);
let sum = arr.reduce(reducer, 0) //make sure you add an initialiser
return sum / arr.length;
}
const ageExtractor = person => person.age;
const complexKeyExtractor = obj => obj.a.b.c;
console.log(getAverage(numbers));
console.log(getAverage(people, ageExtractor));
console.log(getAverage(moreComplexObjects, complexKeyExtractor));
Примечание для вышеперечисленного: если вы не предоставите второй параметр для Array#reduce
, затем first время выполнения total
будет первым элементом массива, однако время second и далее будет суммой.Не стоит разбираться с этим случаем, так что ввод исходного значения решает его.