Почему не срабатывает if и метод добавляет лишний элемент в массив

Рейтинг: -2Ответов: 1Опубликовано: 09.02.2023

У меня есть методы present и absent которые при вызове добавляют в массив this.visitinMagazine true или false. Проблема заключается в том что условие(this.visitinMagazine.length < 25) которое прописано в методах present и absent выполняется некорректно а именно когда мы добавляем в массив 26 элемент должно выбрасывать ошибку и удалять данный элемент НО этого не происходит и элемент просто добавляется в массив хотя не должен. Но если мы добавим еще 27 элемент то условие(this.visitinMagazine.length < 25) срабатывает выбрасывает ошибку и удаляет сразу два последних элемента и массив становится равен 25 элементам. Почему не срабатывает условие при добавление 26 элемента и как это решить ?

Методы present и absent:

present() {
  try {
    if (this.visitinMagazine.length < 25) {
      this.visitinMagazine.push(true);
      return this;
    } else {
      throw new Error('Много посещений');
    }
  } catch (error) {
    this.visitinMagazine.pop();
    console.error(`${error} Обучение для ${this.firstName} Happy End`)
    return this
  }
}
//______Используется когда студент НЕ был на занятие______//
absent() {
  try {
    if (this.visitinMagazine.length < 25) {
      this.visitinMagazine.push(false);
      return this;
    } else {
      throw new Error('Много пропусков');
    }
  } catch (error) {
    this.visitinMagazine.pop();
    console.error(`${error} Обучение для ${this.firstName} Happy End`)
    return this
  }
}

Общий код:

class Student {
  constructor(firstName, lastName, yearOfBirth, arrayOfGrades) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.yearOfBirth = yearOfBirth;
    this.arrayOfGrades = arrayOfGrades;
    this.age = new Date().getFullYear() - this.yearOfBirth;
    this.avgMark = arrayOfGrades.reduce((sum, item) => {
      return sum += item
    }, 0) / arrayOfGrades.length;

  }
  //______Возраст студента______//
  getAge() {
    const currentYear = new Date().getFullYear();
    try {
      if (this.yearOfBirth < 1900 || this.yearOfBirth >= currentYear) {
        throw new Error('Год рождения студента указан неверно')
      } else {
        return (`${this.firstName}'s old is ${this.age} years`);
      }
    } catch (error) {
      console.error(`Исправьте год рождения ${this.firstName} ${error}`)
    }
  }
  //______Средний бал______//
  averageMark() {
    try {
      if (this.avgMark > 100 || this.avgMark < 0) {
        throw new Error('Оценка расчитана неверно')
      } else {
        return (`${this.firstName}'s average mark is ${this.avgMark}`);
      }
    } catch (error) {
      console.log(`Проверьте правильность ввода данных ${this.firstName} ${error}`)
    }
  }
}

class Visit extends Student {
  constructor(firstName, lastName, yearOfBirth, arrayOfGrades) {
    super(firstName, lastName, yearOfBirth, arrayOfGrades);
    this.visitinMagazine = [];
  }
  //______Используется когда студент был на занятие______//

  //______Используется когда студент НЕ был на занятие______//
  move(whatDo) {
    try {
      this.visitinMagazine.push(whatDo);
      if (this.visitinMagazine <= 25) {
        return this
      } else {
        throw new Error(whatDo ? 'Много посещений' : 'Много пропусков');
      }
    } catch (error) {
      this.visitinMagazine.pop();
      console.error(`${error} Обучение для ${this.firstName} Happy End`);
      return this;
    }
  }
}
class Calculation extends Visit {
  constructor(firstName, lastName, yearsOfBirth, arrayOfGrades) {
    super(firstName, lastName, yearsOfBirth, arrayOfGrades);
  }

  //______Проверяем среднюю оценку и посейщение______//
  summary() {
    const averageVisit = this.visitinMagazine.filter((element) => element === true).length / this.visitinMagazine.length;
    if (this.avgMark > 90 && averageVisit > 0.9) {
      return 'Cool!';
    } else if (this.avgMark > 90 || averageVisit > 0.9) {
      return 'Good, but it can be better!';
    } else {
      return 'Radish';
    }
  }
}
//______Экземпляры расчетов______//
const calculate = new Calculation('Dmitriy', 'Yaroshchuk', 2001, [70, 80, 90, 100, 90, 90, 99, 100, 95, 100]);
const calculate1 = new Calculation('Andrew', 'Kavetsky', 2000, [90, 90, 90, 90, 90, 90, 100, 100, 95, 93]);
const calculate2 = new Calculation('Diana', 'Koko', 1999, [70, 70, 70, 70, 70, 70, 75, 75, 75, 93]);

console.log(calculate.getAge());
console.log(calculate1.getAge());
console.log(calculate2.getAge());

console.log(calculate.averageMark());
console.log(calculate1.averageMark());
console.log(calculate2.averageMark());


//______Посейщение уроков______//
calculate.move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(false).move(true);

//______Посейщение уроков______//
calculate1.move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(false).move(true).move(true);

//______Посейщение уроков______//
calculate2.move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(true).move(false).move(false).move(false).move(false).move(false);

console.log(calculate.visitinMagazine);
console.log(calculate1.visitinMagazine);
console.log(calculate2.visitinMagazine);

console.log(calculate.summary());
console.log(calculate1.summary());
console.log(calculate2.summary());

Ответы

▲ 1Принят

Вам надо изменить логику под условие.

Если вам надо всегда записывать элемент, а потом уже проверять и удалять, то методы должны выглядеть так:

present () {
  try {
    this.visitinMagazine.push(true); // Сначала добавляем

    if (this.visitinMagazine.length <= 25) { // Проверяем
      return this; // ОК, возвращаем
    } else { 
      throw new Error('Много посещений'); // Не ОК, генерим ошибку
    }
  } catch (error) { // Перехватываем ошибку
    this.visitinMagazine.pop(); // Удаляем
    console.error(`${error} Обучение для ${this.firstName} Happy End`)
    return this; // Возвращаем
  }
}

absent () {
  try {
    this.visitinMagazine.push(false);
    
    if (this.visitinMagazine.length <= 25) {
      return this;
    } else {
      throw new Error('Много пропусков');
    }
  } catch (error) {
    this.visitinMagazine.pop();
    console.error(`${error} Обучение для ${this.firstName} Happy End`)
    return this
  }
}

Хотя если к ним присмотреться, это дубликат кода. Я бы заменил эти два метода одним:

unsent (whatDo) {
  try {
    this.visitinMagazine.push(whatDo);

    if (this.visitinMagazine.length <= 25) {
      return this;
    } else {
      throw new Error(whatDo ? 'Много посещений' : 'Много пропусков');
    }
  } catch (error) {
    this.visitinMagazine.pop();
    console.error(`${error} Обучение для ${this.firstName} Happy End`)
    return this
  }
}