Каждый раз, когда вы нажимаете oop на все ключи в drinkRequirements
объекте,
for (const key of drinks) {
if (key === drinkType){
...
} else {
...
}
}
вы проверяете условие с каждым ключом в if
и else
постах. Это будет true
для одного из элементов в l oop, если переменная drinkType
равна названию вашего значения key
, но будет false
во всех других случаях. Вы не хотите, чтобы это случилось с каждым ключом в l oop.
Переосмыслите свои логи c. Если вы хотите узнать, соответствует ли строка ключу внутри объекта, вы можете либо получить ключ и проверить его значение. Как вы делаете здесь.
let drinkCost = coffeeShop.drinkRequirements[drinkType];
Или проверьте это с помощью метода Object.prototype.hasOwnProperty()
.
if (coffeeShop.hasOwnProperty(drinkType)) { ...
Или даже используйте массив ключей, который вы уже сделали с Object.keys()
и используйте метод Array.prototype.find()
, чтобы найти ключ, соответствующий значению каждого напитка.
const drinkRequirement = drinks.find(drink => drink === drinkType);
if (drinkRequirement !== undefined) { ...
Используйте вместо этого один из них. Любой из них хорош, хотя первый вариант может быть самым простым с точки зрения простоты.
Я не согласен с @dave, что вы должны заменить this
на coffeeshop
, поскольку это будет жестко задавать переменную coffeeshop в функции, хотя отсутствующий обратный удар был в точке. this
будет ссылкой на объект, в котором находится функция. Это означает, что если вы измените имя переменной coffeeshop
, ссылка останется прежней.
const coffeeShop = {
beans: 40,
drinkRequirements: {
latte: 10,
americano: 5,
doubleShot: 15,
frenchPress: 12
},
makeDrink(drinkType) {
const drinkRequirement = this.drinkRequirements[drinkType];
if (drinkRequirement) {
const beansStock = this.beans;
if (drinkRequirement <= beansStock) {
this.beans = (beansStock - drinkRequirement);
console.log(`Good news! we have ${drinkType} and we have enough beans.`)
} else {
console.log("OUT of beans!")
}
} else {
console.log(`We dont serve ${drinkType}.`)
}
}
}
// tests that wont run correctly:
coffeeShop.makeDrink("latte");
coffeeShop.makeDrink("americano");
coffeeShop.makeDrink("filtered");
coffeeShop.makeDrink("doubleShot");
coffeeShop.makeDrink("frenchPress");