Функция торгового автомата в Javascript - PullRequest
2 голосов
/ 07 января 2020

Я очень новичок в Javascript: я работаю с ним несколько недель случайно. Это мой первый пост, поэтому я прошу прощения, если я недостаточно подробен, но я думаю, что я был ниже!

Я хочу создать функцию VendingMachine (закуска, приблизительно sh), у которой есть список из 4 предметов и их цены, которая принимает 2 аргумента, «название закуски» (закуска) и «вставлено около * 1011» (около sh). Я пытался сделать список объектом и массивом, и имел только полу-успех с массивом, но я верю, что этот объект действительно является тем путем, который я хочу выбрать, потому что ...

При использовании массива с вложенных массивов для списка закусок, единственная проблема заключается в том, что если for () l oop не находит значение «закуски» ни в одном из массивов, оно выводит «undefined» вместо «Извините, попробуйте еще раз».

Имея список объектов в машине в объекте, я хочу проверить, что "snack ==== object.KEY" и что "ca sh> = VALUE" этого KEY. Моя проблема здесь в том, что я плохо знаю синтаксис, относящийся к объектам, а объяснения и ответы, которые, как я вижу, публикуют другие люди, слишком абстрактны для меня, чтобы их можно было понять в данный момент, или представляют собой более сложные циклы / проблемы и на самом деле не кажутся быть применимым к моей ситуации. Все, кроме этого (что я не мог понять, либо не работало):

 for(var key in objects) {
    var value = objects[key];
}

// Using an array

    function vendingMachine(snack, cash) {
    //declare nested arrays of snacks & costs
    var snacks = [
        ["Espresso", 1],
        ["Cappuccino", 2.50],
        ["Chocolate bar", 2],
        ["Potato Chips", 3.50]
    ]
    //iterate through array to match snack and check funds
    for (var i = 0; i < snacks.length; i++) {
        if (snack === snacks[i][0] && cash >= snacks[i][1]) {
            if (snack === "Potato Chips") {
                console.log("Your " + snack + " have been served");
            } else {
                console.log("Your " + snack + " has been served");
            }
        }
        else if (snack === snacks[i][0] && cash <= snacks[i][1]) {
            console.log("Insufficient funds. Please insert more cash.");
        }
    }
}


// Using an object (incomplete or perhaps just VERY incorrect, I'm aware, hence why I'm here to understand why!)

    function vendingMachine(snack, cash) {
    //declare nested arrays of snacks & costs
    var snacks = {
        "Espresso": 1,
        "Cappuccino": 2.50,
        "Chocolate bar": 2,
        "Potato Chips": 3.50
    }

    if (snack === snacks.hasOwnProperty() && cash >= snacks.key) {
        if (snack === "Potato Chips") {
            console.log("Your " + snack + " have been served");
        } else {
            console.log("Your " + snack + " has been served");
        }
    }
    else if (snack === snacks.hasOwnProperty() && cash <= snacks.key) {
        console.log("Insufficient funds. Please insert more cash.");
    }
    else if (snack != snacks.hasOwnProperty()) {
        console.log(snack + " does not exist. Please try again.") //returns undefined
    }
}

Ответы [ 4 ]

3 голосов
/ 07 января 2020

Я бы, вероятно, создал список в виде массива объектов, поскольку он дает вам гибкость, когда вам нужно добавить больше деталей о закусках. Таким образом, список может быть как

const snacks = [
  {
    "name": "Chips",
    "price": 123
  },
  {
    "name": "Drinks",
    "price": 456
  }
];

Теперь ваша функция vendingMachine может быть очень простой, которая найдет подходящую закуску и цену. Примерно так

function vendingMachine(name, price) {
  const canSnackBeServed = snacks.find(snack => snack.name === name && price >= snack.price);

  if (canSnackBeServed) {
    console.log("Your " + name + " has been served");
  } else {
    console.log("Snack doesn't exist or Insufficient funds.");
  }
}

Надеюсь, это поможет

2 голосов
/ 07 января 2020

Используя некоторые современные javascript Я обновил ваш торговый автомат, а также заставил его вернуть изменения.

function vendingMachine(snack, cash) {
    const snacks = [
        { name: 'Espresso', price: 1 },
        { name: 'Cappuccino', price: 2.50 },
        { name: 'Chocolate', price: 2 },
        { name: 'Potato', price: 3.50 }
    ];

    const selected_snack = snacks.find(item => item.name === snack);

    if (selected_snack) {
        if (selected_snack.price === cash) {
            return `Your ${snack} have been served`;
        }
        else {
            if (selected_snack.price > cash) {
                return `Insufficient funds. Please insert more cash.`;
            }
            else {
                return `Your ${snack} have been served. Here is your $${cash - selected_snack.price} change.`;
            }
        }
    }

    else {
        return `${snack} does not exist. Please try again`
    }
};

console.log(vendingMachine('Espresso', 12));

Сначала мы преобразуем закуски в массив объектов, каждый из которых имеет * Клавиши 1004 * и price.

Далее мы используем метод Array.find () для поиска в списке закусок для рассматриваемой закуски по ее названию. Функция вернет один объект, если вы хотите, чтобы несколько результатов, соответствующих какому-либо критерию, вместо этого использовали Array.filter().

Так что, если у нас есть совпадение, мы можем сказать if (selected_snack), что оценивается как true, в противном случае, если тогда не будет совпадения, selected_snack будет undefined, поэтому, по сути, это менее подробный способ сказать if (selected_snack !== undefined).

Остальная часть функции почти самоочевидна, единственное, что я сделал, это то, что я я не веду консольные журналы внутри функции, вместо этого я использую оператор return.

Также, если вам интересно, что это за странные вещи $ {}, посмотрите о литералах шаблона чрезвычайно прост и удобен в использовании, поэтому вам не нужно писать уродливый код, такой как "Your " + snack + " have been served".

Надеюсь, это поможет, если у вас возникнут вопросы, дайте мне знать.

1 голос
/ 07 января 2020
 function vendingMachine(snack, cash) {
//declare nested arrays of snacks & costs
var snacks = {
    "Espresso": 1,
    "Cappuccino": 2.50,
    "Chocolate bar": 2,
    "Potato Chips": 3.50
}

if (snacks.hasOwnProperty(snack) && cash >= snacks[snack]) {
    if (snack === "Potato Chips") {
        console.log("Your " + snack + " have been served");
    } else {
        console.log("Your " + snack + " has been served");
    }
}
else if (snacks.hasOwnProperty(snack) && cash <= snacks[snack]) {
    console.log("Insufficient funds. Please insert more cash.");
}
else if (snack != snacks.hasOwnProperty(snack)) {
    console.log(snack + " does not exist. Please try again.") //returns undefined
}

}

1 голос
/ 07 января 2020

Немного трудно понять, что именно не так с вашим кодом; Я бы предположил, что одной из основных проблем может быть то, как вы используете snacks.hasOwnProperty().

Object.hasOwnProperty, принимает аргумент, который является ключом, и возвращает логическое значение. Таким образом, в вашем примере код должен выглядеть более похоже на snacks.hasOwnProperty(snack), который будет проверять, имеет ли объект snacks свойство snack.

Как вы храните данные, зависит от вас, и вы Вы достаточно близки к тому, чтобы заставить его работать. Следует отметить, что snacks.key попытается получить свойство key snacks, что, вероятно, не то, что вы хотели здесь сделать. Вместо этого что-то вроде snacks[snack] могло бы быть более подходящим. Вы можете использовать либо точечную нотацию, либо нотацию в квадратных скобках, чтобы получить свойства объектов.


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

То, что я настроил ниже, позволит вам иметь обобщенную c функцию getSnack, которая будет определять, какую функцию она должна используйте, чтобы получить правильные данные закуски. Это означает, что вам не нужно беспокоиться о том, как вы сохранили данные закусок в момент использования.

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

Надеюсь, это поможет, пожалуйста, задавайте любые вопросы.

const snacks = {
  "Espresso": 1,
  "Cappuccino": 2.50,
  "Chocolate bar": 2,
  "Potato Chips": 3.50
};

const snacksArray = [
  ["Espresso", 1],
  ["Cappuccino", 2.50],
  ["Chocolate bar", 2],
  ["Potato Chips", 3.50]
];

const getSnackFromArray = (array, itemName) => array
  .find(x => x[0] === itemName)

const getSnackFromObject = (snackDataObject, itemName) => (
  snackDataObject.hasOwnProperty(itemName)
    ? [itemName, snackDataObject[itemName]]
    : undefined
)

const getSnack = (data, itemName) => Array.isArray(data)
  ? getSnackFromArray(data, itemName)
  : getSnackFromObject(data, itemName)
  
const vendingMachine = (snack, cash) => {
  const snackData = getSnackFromObject(snacks, snack);
  
  if (snackData === undefined) {
    console.log(snack + " does not exist. Please try again.")
    return;
  }
  
  const [snackName, cost] = snackData;
  
  if (cash >= cost) {
    console.log("Your " + snack + " have been served")
  } else {
    console.log("Insufficient funds. Please insert more cash.")
  }
}

vendingMachine('Espresso', 1.1)
vendingMachine('Espresso', 1)
vendingMachine('Espresso', 0.9)
vendingMachine('Expresso', 0.9)
...