使用 Javascript 在构造函数中使用数组

问题描述 投票:0回答:6

我一直在尝试找到一种方法来正确地将数组定义为构造函数值之一。假设我们有一个学生,我们需要一个包含他成绩的数组,然后使用我们需要的数组来获取该学生成绩的平均值。遗憾的是,我只发现一些线程在其他编程语言中解决了这个问题。这就是我认为可行的方法:

function student(name, surname, number, grades) {
this.name = name;
this.surname = surname;
this.number = number;
this.grades = [];
this.average = function(grades) {
 var sum = 0;
 for(var i = 0; i < grades.length; i++) {
  sum + = grades[i];}
  var average = sum / grades.length;
  return average;
 }
}

然后

var student1 = new student("Peter","Cat",14444,[2,3,4]);
console.log(student1);

不幸的是,它显示我的成绩数组为空白,我看不到我的平均函数是否正常工作。我应该更改哪一部分,以便我实际上在成绩数组中拥有一些值?

谢谢你。

javascript arrays constructor
6个回答
4
投票

你有几件事搞砸了。如果您要将成绩数组作为参数传递,那么您需要使用以下方法设置成绩:

this.grades = grades;

此外,在平均函数中,您需要使用

this.grades
来引用成绩,而不仅仅是成绩。这将允许您稍后添加更多成绩并仍然获得正确的平均值。您还可以考虑通过使用以下内容定义构造函数来使成绩可选:

function student(name, surname, number, grades =[])

那么如果你不传入值,将会有一个空数组等待你。

最后你可能会得到这样的结果:

function student(name, surname, number, grades = []) {
  this.name = name;
  this.surname = surname;
  this.number = number;
  this.grades = grades;
  this.average = function() {
    return this.grades.reduce((a, c) => a + c, 0) / this.grades.length
  }
}

var student1 = new student("Peter", "Cat", 14444, [2, 3, 4]);
console.log("Average: ", student1.average())

// add another grade:
student1.grades.push(6)
console.log("New Average: ", student1.average() )


3
投票

您可以使用 ES6 解决同样的问题,在您的代码中,您在函数内部使用空数组初始化

this.grade=[]
,因此仅对空数组进行进一步的平均值处理。为了良好的实践,函数参数应该分配一个默认值,这样,如果我们错误地没有传递数组作为参数,那么函数参数将使用默认值。附上 ES6 代码片段以便于理解。

class std{
constructor(name, surname, number, grades = []) {
    this.name = name;
    this.surname = surname;
    this.number = number;
    this.grades = grades;
}  

average() {
  if(this.grades.length !== 0){
    return this.grades.reduce((previous, current) => previous + current, 0) / 
    this.grades.length
  } else { return "no grades mentioned"; }
 }
}

var student1 = new std("Peter", "Cat", 14444, [1, 3, 4]);
console.log("Average: ", student1.average());
//add new student
var student2 = new std("Prasanna", "Test", 14444);
console.log(student2); 

//student2.grades.push(7)
//console.log("New Average: ", student2.average() )

1
投票

您已经将

grades
传递到
student()
函数中,因此不需要将其传递到
student.average
函数中(因为内部函数已经可以访问外部函数参数)。因此,您也无需设置
this.grades = []

另外,

sum + = grades[i]
应该是
sum += grades[i]

只需修复此错误,然后省略将

grades
传递到内部函数即可正确显示平均值,如下所示:

function student(name, surname, number, grades) {
  this.name = name;
  this.surname = surname;
  this.number = number;
  this.average = function() {
    var sum = 0;
    for (var i = 0; i < grades.length; i++) {
      sum += grades[i];
    }
    var average = sum / grades.length;
    return average;
  }
}

var student1 = new student("Peter", "Cat", 14444, [2, 3, 4]);
console.log(student1.average());


0
投票

变量的初始化是一个空数组。

this.grades = [];

应该是

this.grades = grades;

但是,我建议您学习一些 javascript ES6 / ECMAScript 2015 并使用类。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

class Student {
  constructor(grades) {
    //... Other code
    this.grades = grades;
  }
}

0
投票

你可以使用这条线:

函数学生(姓名,编号,成绩){ }

而不是这个:

函数student(姓名,学号,成绩 = [ ]){ }

function student(name, surname, number, grades) {
  this.name = name;
  this.surname = surname;
  this.number = number;
  this.grades = grades;
  this.average = function() {
    return this.grades.reduce((a, c) => a + c, 0) / this.grades.length
  }
}

var student1 = new student("Peter", "Cat", 14444, [2, 3, 4]);
console.log("Average: ", student1.average())

// add another grade:
student1.grades.push(6)
console.log("New Average: ", student1.average() )


0
投票

我们可以使用对象方法来存储平均值:

function Student(name, surname, number, grades = [])
{
    this.name = name;
    this.surname = surname;
    this.number = number;
    this.grades = grades;

    //Method to calculate the Average
    this.average = function()
    {
        if(this.grades.length !==0)
        {
            //Return the Average Calculation
            return this.grades.reduce((previous, current) => previous + current, 0) / this.grades.length
        }
        else
        {
            //This will return if grades not provided
            return "No Grades Mentioned"
        }
    }

}

//With Grades
var student1 = new Student("Srinivasan", "Raja", 1635, [22,43,67,89,90]);
console.log(student1, "Average: "+ student1.average());

//Without Grades
var student1 = new Student("Denny", "Lawrence", 1635);
console.log(student1, "Average: "+ student1.average());
© www.soinside.com 2019 - 2024. All rights reserved.