найти среднее из массива объектов - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь найти среднее значение только для женщин в данном массиве

sortArray([
    {name:'Sarah', gender:'female', age:25},
    {name:'Tom', gender:'male', age:18},
    {name:'Tim', gender:'male', age:65},
    {name:'Kim', gender:'female', age:58}
]);

вот что у меня ниже

function averageFemale(list)
{
    let sum = 0;
    let femaleCount = 2;
    let avg = sum / femaleCount;

    for (let i = 0, i < list.length; i++)
    {
        sum += list[i];
    }

    return avg;
}

Ответы [ 8 ]

0 голосов
/ 10 августа 2019

Вот мое решение, которое я считаю более гибким:

function sumOfArrayWithParameter (array, parameter) {
  let sum = null;
  if (array && array.length > 0 && typeof parameter === 'string') {
    sum = 0;
    for (let e of array) if (e && e.hasOwnProperty(parameter)) sum += e[parameter];
  }
  return sum;
}

Чтобы получить среднее значение, вы просто использовали бы его так:

let sum = sumOfArrayWithParameter(array, 'age');
let avg = sum / array.length;
0 голосов
/ 01 ноября 2018

Вы можете сделать это с помощью одного снижения

function averageBy(arr) {
    const {total, count} = arr.reduce((a, b) => {
            if (b.gender === 'female') {
                a.total += b.age;
                a.count++;
            }
            return a;
        }, {total: 0, count: 0});
    
    return total / count;
}

console.log(averageBy(arr));
<script>
const arr = [
    {
        name: 'Sarah',
        gender: 'female',
        age: 25
    },
    {
        name: 'Tom',
        gender: 'male',
        age: 18
    },
    {
        name: 'Tim',
        gender: 'male',
        age: 65
    },
    {
        name: 'Kim',
        gender: 'female',
        age: 58
    }
];
</script>
0 голосов
/ 01 ноября 2018

Это только мой подход ( зацикливание только один раз для массива ), и основанный на следующей математической формуле для прогрессивного вычисления среднего:

avgN = (x1 + ... + xN) / N = (x1 + ... + xN-1) / N + (xN / N)

     = (x1 + ... + xN-1) * (N-1) / (N * (N-1)) + (xN / N)

     = ((x1 + ... + xN-1) / (N-1)) * ((N-1) / N) + (xN / N)

     = avgN-1 * (N-1) / N + (xN / N)

     = ((N-1) avgN-1 + xN) / N

var sortArray = [
    {name:'Sarah', gender:'female', age:25},
    {name:'Tom', gender:'male', age:18},
    {name:'Tim', gender:'male', age:65},
    {name:'Kim', gender:'female', age:58}
];

function averageFemale(list)
{
    var count = 0;

    return list.reduce((avg, personData) =>
    {
        if (personData.gender === 'female')
            avg = (count * avg + personData.age) / (++count);

        return avg;
    },0);
}

console.log("Average age of females is: " + averageFemale(sortArray));
0 голосов
/ 01 ноября 2018

Вы также можете:

  • Отфильтруйте входной массив, используя .filter(), чтобы получить только объекты, имеющие gender как female.
  • Используйте .reduce(), чтобы получить сумму возрастов.
  • Рассчитать среднее значение, разделив вычисленную выше сумму на количество объектов в фильтрованном массиве.

Демо:

let data = [
  {name:'Sarah', gender:'female', age:25},
  {name:'Tom', gender:'male', age:18},
  {name:'Tim', gender:'male', age:65},
  {name:'Kim', gender:'female', age:58}
];

let filteredData = data.filter(({ gender }) => gender == 'female'),
    avg = filteredData.reduce((r, c) => r + c.age, 0) / filteredData.length;
                 
console.log(avg);
0 голосов
/ 01 ноября 2018

Вот способ сделать это, сократив возраст женщин и разделив их на общее число женщин:

const data = [{name:'Sarah', gender:'female', age:25}, {name:'Tom', gender:'male', age:18}, {name:'Tim', gender:'male', age:65}, {name:'Kim', gender:'female', age:58}];

let count = 0;
const average = data.reduce((total, person) => {
  if (person.gender === 'female') {
  	total += person.age;
    count++;
  }
  return total;
}, 0) / count;

console.log(average);
0 голосов
/ 01 ноября 2018

Вам необходимо проверить пол перед добавлением возраста к sum, а также увеличить femaleCount вместо жесткого кодирования до 2.

Также нет необходимости пересчитывать avg каждый раз в цикле, вы можете сделать это один раз в конце.

function averageFemale(list) {
  let sum = 0;
  let femaleCount = 0;
  for (let i = 0; i < list.length; i++) {
    if (list[i].gender == 'female') {
      sum += list[i].age;
      femaleCount++;
    }
  }
  if (femaleCount == 0) {
    return 0; // prevent division by 0
  }
  let avg = sum / femaleCount;
  return avg;
}

console.log(averageFemale([{name:'Sarah', gender:'female', age:25}, {name:'Tom', gender:'male', age:18}, {name:'Tim', gender:'male', age:65}, {name:'Kim', gender:'female', age:58}]));

У вас также была опечатка в заголовке цикла for, , должно быть ;.

0 голосов
/ 01 ноября 2018

Вы можете отфильтровать "женщин" в новый массив, а затем уменьшить его до общего числа всех возрастов, а затем использовать длину массива женщин, чтобы поделить итог на:

const people = [{name:'Sarah', gender:'female', age:25}, {name:'Tom', gender:'male', age:18}, {name:'Tim', gender:'male', age:65}, {name:'Kim', gender:'female', age:58}];

const females = people.filter(person => person.gender === 'female');

const average = females.reduce((total, next) => total + next.age, 0) / females.length;

console.log(average);
0 голосов
/ 01 ноября 2018

Вам нужно проверить свойство gender, взять сумму age и увеличить счетчик, потому что вы не знаете этого заранее.

function averageFemale(list) {
    var sum = 0,
        count = 0,
        i;

    for (i = 0; i < list.length; i++) {
        if (list[i].gender === 'female') {
            sum += list[i].age;
            ++count;
        }
    }
    return sum / count;
}

var array = [{ name: 'Sarah', gender: 'female', age: 25 }, { name: 'Tom', gender: 'male', age: 18 }, { name: 'Tim', gender: 'male', age: 65 }, { name: 'Kim', gender: 'female', age: 58 }];

console.log(averageFemale(array));
...