寻找一个对象数组的平均值

16

我正在尝试仅找出给定数组中女性的平均值

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;
}

2
你是在尝试计算他们的平均年龄吗?如果是的话,在你的函数中,你真的应该使用他们的年龄。 - ecg8
你正在尝试解决这个Codewars的kata :D https://www.codewars.com/kata/5aa1931311dbd9358b000823/train/javascript - nerdess
9个回答

40

您可以将“女性”筛选到一个新数组中,并将其缩减为所有年龄的总和,然后使用女性数组的长度将总和除以:

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);


6
您还可以:
  • 使用 .filter() 过滤输入数组,只获取 genderfemale 的对象。
  • 使用 .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);


如果你想将其压缩成一行,那么可以考虑在reduce函数中使用source-array参数,并在累加之前将c.age除以数组长度。即:reduce((r,c,i,a)=> r+c.age/a.length,0) - John

4

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}
]


function averageAgeByGender(array,gender){
  const getGender = (elem) => elem.gender===gender
  const average = (a,b, i, self)=> (a+b.age/self.length)
  return array.filter(getGender).reduce(average,0)
}

console.log(averageAgeByGender(arr,'female'))


3
你需要在将年龄添加到 “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}]));

你在循环头部也有一个错字,, 应该改为 ;

3
你可以使用单个reduce函数来实现这一点。

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>


1
你需要检查 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));


1
这是我的解决方案,我认为它更具灵活性:
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;

这很酷,谢谢分享! - Christopher Caldwell

0

这里有一种方法,通过减少女性的年龄并除以总女性人数来实现:

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

这只是我的方法(仅在数组上循环一次),并基于下一个用于渐进计算平均值的数学公式:

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));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接