【问题标题】:Difficulty Iterating Through Function Call - First Class Functions难以通过函数调用进行迭代 - 第一类函数
【发布时间】:2020-11-27 15:55:29
【问题描述】:

我提供的代码可以正常执行,但是正如您所见,它会反复为每位客人提供茶点,然后再继续下一位客人。

我正在摸索如何以有效的方式更改我的代码,以便轮流为每个客户提供茶点,但在程序运行时仍然每次都得到四次服务。

非常感谢所有建议。

JS:

var guests = [
    {name: "Rick Sanchez", paid: false, loyaltyCard: true},
    {name: "Morty Smith", paid: true, loyaltyCard: true},
    {name: "Beth Smith", paid: true, loyaltyCard: false},
    {name: "Jerry Smith", paid: true, loyaltyCard: false},
    {name: "Sleepy Gary", paid: true, loyaltyCard: false},
    {name: "Summer Smith", paid: true, loyaltyCard: false},
    {name: "Mr. Poopybutthole", paid: true, loyaltyCard: true},
    {name: "Pencilvester", paid: true, loyaltyCard: false}
];


function serveGuest(guest) {
    var getRefreshmentOrder = createRefreshmentOrder(guest);
    
    getRefreshmentOrder();
    // Loyalty Stamps
    getRefreshmentOrder();
    getRefreshmentOrder();
    // Agressive Advertisment
    getRefreshmentOrder();
    // Thank you. Come again.
}

function createRefreshmentOrder(guest) {
    var orderFunction;

    if (guest.loyaltyCard) {
        orderFunction = function() {
            alert("Would you like any premium refreshments from our Membership Menu, at no extra cost?");
        };
    } else {
        orderFunction = function() {
            alert("Can we get you any refreshments?");
        };
    }
    return orderFunction;
}

function serveAllGuests(guests) {
    for (var i = 0; i < guests.length; i++) {
        serveGuest(guests[i]);
    }
}

serveAllGuests(guests);


【问题讨论】:

  • 你能解释更多吗?
  • 这里想要的结果到底是什么?高阶函数从何而来?

标签: javascript first-class-functions function-expression


【解决方案1】:

如果不了解您在此处尝试做什么,很难提出建议。如果你只是想单独运行这个小程序,那么一种方法是在serveGuest 中调用你的getRefreshmentOrder 一次,然后在最后添加一个循环来为所有客人服务四次。然后,您将按顺序为每位客人服务一次,然后再重复三遍。

function serveGuest(guest) {
    var getRefreshmentOrder = createRefreshmentOrder(guest);
    getRefreshmentOrder();
}

function serveAllGuests(guests) {
    for (var i = 0; i < guests.length; i++) {
        serveGuest(guests[i]);
    }
}

for (var i = 0; i < 4; i++) {
  serveAllGuests(guests)
}

这与您的原始代码效率差不多。

【讨论】:

    【解决方案2】:

    您可以将其包装在另一个运行四次的 for 循环中,然后在您的 serveGuest 函数中只调用一次 getRefreshmentOrder()

    function serveAllGuests(guests) {
        for(var j = 0; j < 4; j++){
            for (var i = 0; i < guests.length; i++) {
                serveGuest(guests[i]);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这可能是我清理和组织得更好的方式。

      基本上,这为您提供了两个函数 - takeOrder(guest)takeOrders(guests),因此您可以通过调用前者为单个客人提供服务,也可以使用后者为一组客人提供服务。无论哪种方式,它们都归结为在来宾实例上调用 takeOrder 函数,因此您只需更新一个函数即可完成它需要做的任何事情,并且无处不在。

      它还允许您通过更新totalNumberOfTimesToServe 常量中的值来更改为它们提供服务的次数。

      const guests = [
        { name: "Rick Sanchez", paid: false, loyaltyCard: true },
        { name: "Morty Smith", paid: true, loyaltyCard: true },
        { name: "Beth Smith", paid: true, loyaltyCard: false },
        { name: "Jerry Smith", paid: true, loyaltyCard: false },
        { name: "Sleepy Gary", paid: true, loyaltyCard: false },
        { name: "Summer Smith", paid: true, loyaltyCard: false },
        { name: "Mr. Poopybutthole", paid: true, loyaltyCard: true },
        { name: "Pencilvester", paid: true, loyaltyCard: false }
      ];
      const totalNumberOfTimesToServe = 4;
      
      var timesServed = 0;
      
      function takeOrder(guest) {
        if (guest.loyaltyCard) {
          console.log(
            `Would you like any premium refreshments from our Membership Menu, at no extra cost, ${guest.name}?`
          );
        } else {
          console.log(`Can we get you any refreshments, ${guest.name}?`);
        }
      }
      
      function takeOrders(guests) {
        // take orders for each guest until we've fulfilled our iteration count
        while (timesServed < totalNumberOfTimesToServe) {
          console.log(`Serving number: ${timesServed + 1}`);
      
          guests.forEach((guest) => {
            takeOrder(guest);
          });
      
          // after each iteration of taking orders, increment our times served by one
          timesServed++;
        }
      
        // reset our times served back to 0
        timesServed = 0;
      }
      
      takeOrders(guests);

      你也可以看到它在这个 codepen 中运行: https://codepen.io/barneychampaign/pen/oNzNOXv

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 2012-05-29
        • 2013-12-27
        • 1970-01-01
        • 2020-10-18
        • 2020-05-09
        相关资源
        最近更新 更多