Javascript - 使用日期函数运行模拟的原型函数

Javascript - Prototype function which runs a simulation using the date function

我正在尝试向我的程序中添加两个函数。其中之一会将原型的可用 属性 从 true 更改为 false 并设置结帐日期。结帐日期需要设置为当前日期减去一些随机天数(天数应该是随机的)。

我的尝试:

    Book.prototype.checkOut = function() {
    this.Available = false;
    var temp = new Date(1000000000);
    var date = new Date() - temp;
    var res = new Date(date);
    this.checkoutDate = res;
};

第二个检查当前日期和签出日期,如果超过 14 天,则 returns 为真。

我的尝试:

    Book.prototype.isOverdue = function() {
    var singleDay = 1000 * 60 * 60 * 24;
    var todayDate = new Date().getTime();
    var difference = todayDate - this.checkoutDate.getTime();
    if (Math.round(difference / singleDay) >= 14) {
        return true;
    }
    return false;
};

我所有的代码:

var Book = function(title, Available, publicationDate, checkoutDate, callNumber, Authors) {
  this.title = title;
  this.Available = Available;
  this.publicationDate = publicationDate;
  this.checkoutDate = checkoutDate;
  this.callNumber = callNumber;
  this.Authors = Authors;
};

var Author = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
};

var Patron = function(firstName, lastName, libCardNum, booksOut, fine) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.libCardNum = libCardNum;
  this.booksOut = booksOut;
  this.fine = fine;
};

Book.prototype.checkOut = function() {
  this.Available = false;
  var temp = new Date(1000000000);
  var date = new Date() - temp;
  var res = new Date(date);
  this.checkoutDate = res;
};

Book.prototype.checkIn = function() {
  this.Available = true;
};

Book.prototype.isOverdue = function() {
  var singleDay = 1000 * 60 * 60 * 24;
  var todayDate = new Date().getTime();
  var difference = todayDate - this.checkoutDate.getTime();
  if (Math.round(difference / singleDay) >= 14) {
    return true;
  }
  return false;
};

Patron.prototype.read = function(book) {
  this.booksOut.add(book);
}

Patron.prototype.return = function(book) {
  this.booksOut.remove(this.booksOut.length);
}

var authors = [];
authors[0] = new Author("Auth", "One");
authors[1] = new Author("AutL", "Two");

var catalog = [];
catalog[0] = new Book('Bk1', true, new Date(2001, 1, 21), new Date(), 123456, authors);
catalog[1] = new Book('Bk2', true, new Date(2002, 2, 22), new Date(), 987656, authors);
catalog[2] = new Book('Bk3', true, new Date(2003, 3, 23), new Date(), 092673, authors);
catalog[3] = new Book('Bk4', true, new Date(2004, 4, 24), new Date(), 658342, authors);
catalog[4] = new Book('Bk5', true, new Date(2005, 5, 25), new Date(), 345678, authors);

var patrons = [];
patrons[0] = new Patron('Pat1', 'Wat', 1, catalog, 0.00);
patrons[1] = new Patron('Pat2', 'Wot', 1, catalog, 0.00);
patrons[2] = new Patron('Pat3', 'Wit', 1, catalog, 0.00);
patrons[3] = new Patron('Pat4', 'Wet', 1, catalog, 0.00);
patrons[4] = new Patron('Pat5', 'Wut', 1, catalog, 0.00);

//while loop or for loop for 90 days
//For loop over catalog
//forloop over patrons 
//Check if available , if so check book out
//If not available check book back in
//check checking back in check to see if book is overdue and if so add a fine
//When down loop over patrons to see their fees

for (var i = 0; i < 90; i++) {
  for (var j = 0; j < catalog.length; j++) {
    for (var k = 0; k < patrons.length; k++) {
      var fine = patrons[k].fine;
      if (catalog[k].Available) {
        catalog[k].checkOut;
      } else {
        catalog[k].checkIn;
        patrons[k].read;
      }
      if (catalog[k].isOverdue) {
        fine = fine + 5.00;
      }
      patrons[k].fine = fine;
    }
  }
}

for (i = 0; i < patrons.length; i++) {
  console.log(patrons[i].firstName + " has checked out the following books:");
  for (j = 0; j < patrons[i].booksOut.length; j++) {
    console.log(patrons[i].booksOut[j].title);
  }
  console.log(patrons[i].firstName + " has fine amount: $" + patrons[i].fine);
}

当我 运行 程序时,除赞助人外的所有内容 运行 最终都会收到巨额罚款,因为这应该是随机模拟,我似乎无法弄清楚我应该做些什么来解决这个问题。

你说:

The checkout date needs to be set to the current date minus some random number of days (days should be randomized).

然而没有随机化:

Book.prototype.checkOut = function() {
  this.Available = false;
  var temp = new Date(1000000000);
  var date = new Date() - temp;
  var res = new Date(date);
  this.checkoutDate = res; 
};

表达式 new Date(1000000000) returns 新日期为 1970-01-12T13:46:40.000Z,所以

new Date() - temp;

returns一个很大的数字,比如1491816607452,大约是1726天。它为所有图书的所有顾客设置相同的到期日期,因此他们最终都会收到相同的罚款。

如果您想让顾客在 10 到 20 天的随机时间段内结帐,则:

// Return a random  integer between start and end inclusive
// Does not check if start or end are integers
function randInRange(start, end) {
  return Math.floor(Math.random() * (end - start + 1)) + start;
}

// checkOut method as function for demo
var checkOut = function() {
  // Set randDays to random days from 10 to 20
  var randDays = randInRange(10,20);
  // return date minus randDays  
  var date = new Date();
  date.setDate(date.getDate() - randDays);
  return date;
};

// Some tests, 10 dates randomly 10 to 20 days ago
for (var i=10; i; i--) {
  console.log(checkOut().toString());
}

checkOut 方法是一个普通函数,您可以对其进行修改以适合您的 Book 构造函数。但是,与其将测试数据随机化,不如将其设置为特定值,以便您确切知道结果应该是什么。此外,您应该测试已知的问题案例以确保它们得到正确处理。

我没有详细查看您的其余代码。