Использование массива внутри конструктора с использованием Javascript - PullRequest
0 голосов
/ 26 апреля 2018

Я пытался найти способ правильно определить массив как одно из значений конструктора.Допустим, у нас есть ученик, и нам нужно иметь массив с его оценками, а затем, используя массив, нам нужно получить среднее значение от оценок ученика.К сожалению, я нашел только некоторые темы, решающие эту проблему на других языках программирования.Я думал, что это будет работать:

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

К сожалению, он показывает мой массив оценок пустым, и я не вижу, правильно ли работает моя средняя функция,Какие части я должен изменить, чтобы в массиве оценок были какие-то значения?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы уже передаете 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 голосов
/ 26 апреля 2018

Ваша инициализация переменной - пустой массив.

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 голосов
/ 26 апреля 2018

У вас есть пара ошибок.Если вы собираетесь передать массив оценок в качестве аргумента, то вам нужно установить оценки следующим образом:

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() )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...