通过函数调用进行迭代的困难-一类函数



我提供的代码执行正常,但正如您所看到的,在转到下一位客人之前,它会反复为每位客人提供点心。

我正在绞尽脑汁,想知道如何以一种有效的方式修改我的代码,这样每个客户都可以依次得到点心,但在程序运行时,每个客户仍然可以吃四次。

我们非常感谢所有的建议。

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

如果不了解更多关于您在这里要做什么的信息,很难提出建议。如果您只是想孤立地运行这个小程序,那么一种方法是只在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)
}

这并不比您的原始代码效率更高或更低。

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

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

我可能会这样做,以清理并更好地组织它。

基本上,这为您提供了两个函数——takeOrder(guest)takeOrders(guests),因此您可以只调用前者来为单个来宾提供服务,也可以使用后者为一组来宾提供服务。无论哪种方式,它们都可以归结为在guest的实例上调用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);

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

最新更新