не может получить этот простой код FOR L OOP, запускаемый правильно - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь разгадать простую загадку кафе, цель - проверить, есть ли в меню какой-либо предмет и достаточно ли у меня бобов после подачи каждого напитка.

Я пытался утешить. регистрировать каждую строку - и все же я не понимаю, почему она не работает как задумано - каким-то образом она входит в единицу, если условие - и затем переходит также в другое ... что я делаю неправильно?

спасибо за ваше время

  `const coffeeShop = {
  beans: 40,
  drinkRequirements: {
    latte: 10,
    americano: 5,
    doubleShot: 15,
    frenchPress: 12
  },
  makeDrink: function (drinkType) {
    const drinks = Object.keys(coffeeShop.drinkRequirements);
    let drinkCost = coffeeShop.drinkRequirements[drinkType];
    let binz = this.beans;
    for (const key of drinks) {
      if (key === drinkType){
        if (drinkCost <= binz){
          coffeeShop.beans = [binz - drinkCost]
          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"); `

`see the console output I'm getting- its going the items again and again...`

`Good news! we have latte and we have enough beans
3main.js:328 Sooory Miss Sara- we dont serve latte
main.js:328 Sooory Miss Sara- we dont serve americano
main.js:322 Good news! we have americano and we have enough beans
2main.js:328 Sooory Miss Sara- we dont serve americano
4main.js:328 Sooory Miss Sara- we dont serve filtered
2main.js:328 Sooory Miss Sara- we dont serve doubleShot
main.js:322 Good news! we have doubleShot and we have enough beans
main.js:328 Sooory Miss Sara- we dont serve doubleShot
3main.js:328 Sooory Miss Sara- we dont serve frenchPress
main.js:325 Sorry Mam- we have frenchPress in the Menu - but we are OUT of 
beans!`

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Каждый раз, когда вы нажимаете 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");
0 голосов
/ 13 апреля 2020

Вам необходимо изменить:

let binz = this.beans;

на

let binz = coffeeShop.beans;

и

console.log(`Good news! we have ${drinkType} and we have enough beans')

на

console.log(`Good news! we have ${drinkType} and we have enough beans`)

const coffeeShop = {
  beans: 40,
  drinkRequirements: {
    latte: 10,
    americano: 5,
    doubleShot: 15,
    frenchPress: 12
  },
  makeDrink: function (drinkType) {
    const drinks = Object.keys(coffeeShop.drinkRequirements);
    let drinkCost = coffeeShop.drinkRequirements[drinkType];
    let binz = coffeeShop.beans;
    for (const key of drinks) {
      if (key === drinkType){
        if (drinkCost <= binz){
          coffeeShop.beans = [binz - drinkCost]
          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"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...