首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环不能正确执行函数操作

问循环不能正确执行函数操作
EN

Stack Overflow用户
提问于 2017-04-22 17:26:49
回答 2查看 105关注 0票数 0

我试图让嵌套的循环执行签入/签出模拟。我有我的函数设置和循环在最后,但它总是给我相同的输出。每一位赞助人都有同样数量的书籍和巨额罚款,而不是像checkOut和isOverdue函数那样完全随机化。

如何使循环使用从函数中随机生成的数据,并给每个用户不同数额的罚款和不同的账簿检查?项目说明。

我的代码:

​

代码语言:javascript
复制
    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;
    };

    function randInRange(start, end) {
        return Math.floor(Math.random() * (end - start + 1)) + start;
    }

    Book.prototype.checkOut = function() {
        this.Available = false;
        var dateChk = new Date();
        var randDay = randInRange(1, 25);
        dateChk.setDate(dateChk.getDate() - randDay);
        this.checkoutDate = dateChk;
    };

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

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-22 18:35:33

我必须对你的例子做一些修改,这样它才能真正发挥作用。

需要知道的一件非常重要的事情是,当调用对象的方法时,必须在调用后面加上括号:不是catalog[j].checkOut,而是catalog[j].checkOut()。

您现在可以检查我的更改以及脚本是如何工作的。有了这个手边,你就可以制定后续问题。

希望这能有所帮助。

​

代码语言:javascript
复制
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;
    };

    function randInRange(start, end) {
        return Math.floor(Math.random() * (end - start + 1)) + start;
    }

    Book.prototype.checkOut = function() {
        this.Available = false;
        var dateChk = new Date();
        var randDay = randInRange(1, 25);
        dateChk.setDate(dateChk.getDate() - randDay);
        this.checkoutDate = dateChk;
    };

    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;
    };
    
    // Changed the read method
    Patron.prototype.read = function(book) {
        this.booksOut[book.callNumber] = book;
    }

    // Changed the return method
    Patron.prototype.return = function(book) {
        delete(this.booksOut[book.callNumber]);
    }

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

    // Changed how Patrons are initialised. Instead of passing the full
    // catalog for booksRead an empty object is passed.
    var patrons = [];
    patrons[0] = new Patron('Pat1', 'Wat', 1, {}, 0.00);
    patrons[1] = new Patron('Pat2', 'Wot', 1, {}, 0.00);
    patrons[2] = new Patron('Pat3', 'Wit', 1, {}, 0.00);
    patrons[3] = new Patron('Pat4', 'Wet', 1, {}, 0.00);
    patrons[4] = new Patron('Pat5', 'Wut', 1, {}, 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 < 3; i++) {
        // changed the for loop
        for (var j in catalog) {
            // changed the for loop
            for (var k in patrons) {
                var fine = patrons[k].fine;
                // Changed catalog[k] to catalog[j]
                // moved and changed patrons[k].read() call
                // added the patrons[k].return() call
                if (catalog[j].Available) { 
                    catalog[j].checkOut();
                    patrons[k].read(catalog[j]);
                } else if (patrons[k].booksOut[catalog[j].callNumber]) {
                    catalog[j].checkIn();
                    patrons[k].return(catalog[j]);
                }
                if (catalog[j].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 in patrons[i].booksOut) {
            console.log(patrons[i].booksOut[j].title);
        }
        console.log(patrons[i].firstName + " has fine amount: $" + patrons[i].fine);
    }

​

编辑

回答评论。

这是您如何设置for循环的结果。在第一天,所有的书都交给第一位赞助人,第二天,他们去第二次会议等等。

  1. 第一天,第一本书,第一本:书是可以买到的,并交给第一赞助人。
  2. 第一天,第一本,第二册:没有书。
  3. ..。
  4. 第一天,第二册,赞助人第一天:书可供使用,并提供给第一赞助人。
  5. 第一天,第二册,第二天:没有书。
  6. ..。
  7. 第二天,第一本书,第一本:没有书,书还了。
  8. 第二天,第一册,赞助人第二天:书可以买到,并提供给第二赞助人。
  9. 第二天,第一册,赞助人第三天:没有书。
  10. ..。
  11. 诸若此类
票数 1
EN

Stack Overflow用户

发布于 2017-04-22 18:54:49

说明没有说要洗牌书籍或赞助人,在模拟期间,这样你的结果就不会像你希望的那样随机。此外,我们还可以使用标准的forEach和普通的for循环来循环书籍和赞助者,从而使代码更容易理解。为了获得更好的结果,我在每个循环中使用_.shuffle随机化书籍和赞助者。我们也可以隐藏精细的逻辑,在我们的赞助人返回原型,最后用一个简单的模拟。

代码语言:javascript
复制
for (var i = 0; i < 90; i++) {
  _.shuffle(books).forEach(function(book) {
    _.shuffle(patrons).forEach(function(patron) {
      if (patron.hasBookCheckedOut(book)) {
        return patron.return(book);
      }

      if (book.available) {
        patron.read(book);
      }     
    });
  });
};

工作实例http://jsbin.com/teyipak/1/edit?js,console

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43562310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档