Как написать функцию, которая возвращает средний возраст пользователей одного пола?

Не могу решить задачу. Нужно создать функцию getUsersNamesInAgeRange(users, gender), которая возвращает среднее значение возраста пользователей одного пола. На данный момент смогла написать только так, но результат неверный:

function getUsersNamesInAgeRange(users, gender) {
    const filteredGender = users.filter((user) => {
        return user.gender === gender;
    });
    const ageSum = users.reduce((sum, user) => {
    return sum + user.age
}, 0);

  return ageSum / users.length
}

Подскажите, что я делаю не так? Заранее благодарю за ответ!


Ответы (3 шт):

Автор решения: Faraday

У вас была проблема в том, что вы после фильтрации users всё равно использовали его же, вместо отфильтрованного filteredGender

function getUsersNamesInAgeRange(users, gender) {

    const filteredGender = users.filter((user) => user.gender === gender);
    if (filteredGender.length === 0) {
        return 0;
    }

    const ageSum = filteredGender.reduce((sum, user) => sum + user.age, 0);
    return ageSum / filteredGender.length;
}
→ Ссылка
Автор решения: ksa

Подскажите, что я делаю не так?

Например не стоит делать два прохода по данным... Ну и за переменными следить. ;)

const users = [
  {age: 20, gender: 0}, 
  {age: 30, gender: 1}, 
  {age: 40, gender: 0}, 
  {age: 10, gender: 1}, 
]
const gender = 1
console.log(getUsersNamesInAgeRange(users, gender))

//
function getUsersNamesInAgeRange(users, gender) {
  const o = users.reduce((o, u) => {
    if (u.gender === gender) {
      o.count++
      o.sum += u.age
    }
    return o
  }, {count: 0, sum: 0});
  return o.count ? o.sum / o.count : null
}

→ Ссылка
Автор решения: DiD

const users = [
  {age: 20, gender: 0}, 
  {age: 30, gender: 1}, 
  {age: 40, gender: 0}, 
  {age: 10, gender: 1}, 
]

console.log(
   users
     // Сначала фильтруем нужный гендер
     .filter(val => val.gender == 1)
     // Потом можно сразу посчитать среднее арифметическое 
     // за один проход
     .reduce(
       (avg,val,idx) => avg + (val.age - avg)/(idx + 1),
        0
      )
   );

→ Ссылка