简体   繁体   English

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

[英]Javascript - Prototype function which runs a simulation using the date function

I am trying to add two functions to my program. 我想在我的程序中添加两个函数。 One of them will change the available property of the prototype from true to false and set the checkout date. 其中一个会将原型的可用属性从true更改为false并设置结帐日期。 The checkout date needs to be set to the current date minus some random number of days (days should be randomized). 结帐日期需要设置为当前日期减去一些随机天数(天数应随机化)。

My try: 我的尝试:

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

The second one checks the current date and the checked out date and if it's greater than 14 days it returns true. 第二个检查当前日期和检出日期,如果超过14天则返回true。

My try: 我的尝试:

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

All my code: 我的所有代码:

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

When I run the program, everything runs but the patrons end up getting huge fines, and as this is supposed to be a randomized simulation, I can't seem to figure out what I should do differently to fix that problem. 当我运行程序时,一切都在运行,但顾客最终会收到巨额罚款,因为这应该是一个随机模拟,我似乎无法弄清楚我应该做些什么来解决这个问题。

You say: 你说:

The checkout date needs to be set to the current date minus some random number of days (days should be randomized). 结帐日期需要设置为当前日期减去一些随机天数(天数应随机化)。

yet there is no radomisation in: 然而,没有任何放射:

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

The expression new Date(1000000000) returns a new date for 1970-01-12T13:46:40.000Z, so 表达式new Date(1000000000)返回1970-01-12T13的新日期:46:40.000Z,所以

new Date() - temp;

returns a large number, like 1491816607452, which is about 1726 days. 返回一个大数字,如1491816607452,大约是1726天。 It sets the same expiry date for all patrons for all books, so they all end up with the same fine. 它为所有书籍的所有顾客设定了相同的到期日,因此他们最终都得到同样的罚款。

If you want to have patrons checkout books for random periods of say 10 to 20 days, then: 如果您想让顾客在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()); } 

The checkOut method is a plain function that you can modify to suit your Book constructor. checkOut方法是一个普通函数,您可以修改它以适合您的Book构造函数。 But rather than radomising your test data, it should be set to specific values so you know exactly what the results should be. 但是,不应将测试数据放大,而应将其设置为特定值,以便准确了解结果应该是什么。 Also, you should test known problematic cases to ensure they are handled correctly. 此外,您应该测试已知的有问题的案例,以确保它们得到正确处理。

I haven't looked at the rest of your code in any detail. 我没有详细查看其余的代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM