Javascript 循环遍历一组对象并获得平均值

Javascript 循环遍历一组对象并获得平均值,javascript,Javascript,我希望在我的原型函数中循环一组对象。循环之后,我想得到gpa数组的平均值,然后控制台记录名称、地址、gpa和平均gpa。除了一般水平外,我什么都能做。我希望这一切都在测试函数中一起运行。谢谢你的帮助 var students = [{ name: "Walker", address: { street: "123 South Drive", city: 'Sarasota', state: 'FL' }, gpa:

我希望在我的原型函数中循环一组对象。循环之后,我想得到gpa数组的平均值,然后控制台记录名称、地址、gpa和平均gpa。除了一般水平外,我什么都能做。我希望这一切都在测试函数中一起运行。谢谢你的帮助

var students = [{
    name: "Walker",
    address: {
        street: "123 South Drive",
        city: 'Sarasota',
        state: 'FL'
    },
    gpa: [3.0, 3.4, 3.8]
}, {
    name: "Christian",
    address: {
        street: "5601 Pebble Beach Ln",
        city: 'Sacromento',
        state: 'CA'
    },
    gpa: [2.5, 3.6, 3.8]
}];

var stud = Students(students);



stud.testing();
constructor.js:

var Students = function (students) {
    return new Students.prototype.init(students);
}

Students.prototype = {
    init: function (students) {
        this.students = students;
    },
    testing: function () {


        for (i = 0; i < this.students.length; i++) {
            i = i % this.students.length;


            for (j = 0; j < this.students.length; j++) {



                this.gpa1 = this.students[j].gpa;
                this.len = this.students[j].gpa.length;

                //console.log(this.gpa1);

                this.average = this.gpa1[0] + this.gpa1[1] + this.gpa1[2];
                this.res = this.average / this.len;
                console.log(this.res);
            }




            console.log("Name: " + this.students[i].name);
            console.log("Address: " + this.students[i].address.street + ' ' + this.students[i].address.city + ' ' + this.students[i].address.state);
            console.log("GPA: " + this.students[i].gpa);
            console.log("Average: " + this.gpa1);


        }
    },
    addData: function (student3) {
        this.students.push(student3);
    }
var Students=函数(Students){
返回新的student.prototype.init(Students);
}
Students.prototype={
初始化:函数(学生){
这个。学生=学生;
},
测试:函数(){
for(i=0;i
你有一个计算平均值的起点,但是,看起来你把它作为“总数”来计算:

现在,假设只有三个等级,我们可以做一个小小的改变:

this.average = (this.gpa1[0] + this.gpa1[1] + this.gpa1[2]) / 3.0;
如果您想要一个更动态的平均值,尽管可能不是这样,您可以在循环中执行计算:

for (var avg = 0; avg < this.gpa1.length; avg++) {
    this.average += this.gpa1[avg];
}
this.average = this.average / this.gpa1.length;
for(var avg=0;avg

我上面的两个解决方案都是用来计算每个学生的平均成绩的;如果你需要计算所有学生的总平均成绩,调整上面的循环应该足够了,但为了更精确的例子,请检查。

这应该很简单,循环学生,然后循环他们的GPA分数,将他们相加,然后除以e总点数:

testing: function () {
    var total = 0;
    var numPoints = 0;
    for (var i = 0; i < this.students.length; i++) {
        var thisStudentsTotal = 0;
        for (var j = 0; j < this.students[i].gpa.length; j++) {
            total += this.students[i].gpa[j];
            thisStudentsTotal += this.students[i].gpa[j];
            numPoints++;
        }
        // This is the average for just this student
        this.students[i].myAvg = thisStudentsTotal / this.students[i].gpa.length;
    }
    // This is the average for every student
    var theAverage = total / numPoints;
}
测试:函数(){
var合计=0;
var numPoints=0;
for(var i=0;i
我倾向于在循环对象之前将GPA平均值添加到对象中。这样,您就可以在程序的其他部分重用它,而无需重复代码

在这里,我使用和方法将平均值(小数点后两位)添加到每个student对象,只是因为我认为它更整洁

this.students.map(function (el) {
  el.avg = (el.gpa.reduce(function (p, c) {
    return p + c;
  }) / el.gpa.length).toFixed(2);
  return el;
});
现在你只需在物体上循环

for (var i = 0, l = this.students.length; i < l; i++) {
  var student = this.students[i];
  console.log("Name: " + student.name);
  // etc
}
for(var i=0,l=this.students.length;i

其中包括您的代码,在我看到错误的地方稍加更正。我已将
getAverageGpa
代码分离为一个新函数。

为什么您有这一行
I=I%this.students.length;
?为什么在students数组的循环中有一个嵌套的循环?我这样做是为了能够只记录第一个对象,然后记录第二个对象,而不记录多组控制台日志。有更好的方法吗?我只是在学习,所以我知道我的代码不好。我只是在寻求改进。你应该决定将grade point数组称为“gpa”还是“gpa1”。不可能两者都是:)OP需要所有学生的平均值,还是每个学生的平均值?@newfurniture:我不知道。但我现在已经添加了两者。当然
Array.map
Array.reduce
都需要遍历集合,所以本质上,您仍然有一个嵌套循环。
for (var i = 0, l = this.students.length; i < l; i++) {
  var student = this.students[i];
  console.log("Name: " + student.name);
  // etc
}