Сделать переменную сумму двух других переменных после изменения - PullRequest
0 голосов
/ 06 января 2019

Пожалуйста, посмотрите на следующий код. В этом есть проблема, которую я пытаюсь понять:

let sideCount = 0;
let mealCount = 0;
let itemCount = sideCount + mealCount;

const pizzaOrder = ({size, crustType, topping, quantity}) => {
    quantity = Math.round(parseInt(quantity));
    mealCount += quantity;
    if (topping === "") {
        console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
    } else {
        console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust ${topping} pizza`);
    }
    console.log(`Meal Count after ordering ${quantity} pizzas: ${mealCount}`);
    console.log(`Current item count: ${itemCount}`);        
};

(есть больше, но это то, что важно для вопроса)

Я просмотрел StackOverflow для ссылок и передач по значению или передачи по ссылке, но не смог найти ничего, что решило бы мою проблему.

Когда я обновляю mealCount, он не меняет значение itemCount. Как мне это исправить?

Order: 10 Medium thin crust pepperoni pizza 
Meal Count after ordering 10 pizzas: 10 
Current item count: 0 
Order: 3 burgers with Relish 
Meal Count after ordering burger: 13 
Current item count: 0 
Meal Count: 0 Side Count: 0 
Meal Count: 0 
Side Count: 0 
Meal Count: 0 
Side Count: 0 
Your total is $0.00. Enjoy your meal! 

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Если вы хотите сохранить «состояние» вашего заказа, вы можете использовать объект, который может быть выставлен в любом месте:

const count = {
sideCount: 0,
mealCount: 0,
itemCount() {
    return this.sideCount + this.mealCount
  }
}

const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
count.mealCount += quantity;
if (topping === "") {
    console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
    console.log(`Order: ${quantity} ${size} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${count.mealCount}`);
console.log(`Current item count: ${count.itemCount()}`);        
};
console.log(count.itemCount()) // 0

pizzaOrder({size: 'asd', crustType: 'asd', topping: 'asd', quantity: 1})

console.log(count.itemCount()) // 1

Как уже упоминали другие люди, ваш код не будет работать так. Надеюсь, это поможет.

0 голосов
/ 15 февраля 2019

Вместо добавления mealCount в каждую функцию я возвратил mealCount или sideCount или drinkCount в объекте, например,

return {mealCount: quantity};

Затем я использовал метод Array.prototype.reduce() для параметра orders функции groupOrder(), функции, которую вы вызываете, передавая массив вызовов функций в заказы на питание, с вложенным заказом на питание и вычислениями цены. внутри него

let mealCount = orders.reduce((av, cv) => {
    if (cv.hasOwnProperty('mealCount')) {
        return {mealCount: av.mealCount + cv.mealCount};
    }
    return {mealCount: av.mealCount + 0};
}, {mealCount: 0}).mealCount;
0 голосов
/ 07 января 2019

Код интерпретируется (оценивается) последовательно.

Когда вы пишете: let itemCount = sideCount + foodCount;

Вы фактически назначаете значение sideCount + foodCount для itemCount. В настоящий момент sideCount и foodCount имеют значение «0», следовательно, itemCount равен «0».

Вы вызываете функцию pizzaOrder и меняете foodCount (внутри этой функции), что не заставит javascript переоценивать еще раз добавление упомянутой строки (пусть itemCount = sideCount + foodCount).

Буквально, функция pizzaOrder вообще не влияет на переменную "itemCount".

Одним из решений проблемы было бы добавить строку: «itemCount = sideCount + mealCount» внутри функции pizzaOrder, в частности под строкой: «mealCount + = количество;».

Итак, ваш код будет выглядеть так:

const pizzaOrder = ({size, crustType, topping, quantity}) => {
    quantity = Math.round(parseInt(quantity));
    mealCount += quantity;
    totalCount = mealCount + sideCount;
    if (topping === "") {
        console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
    } else {
        console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust ${topping} pizza`);
    }
    console.log(`Meal Count after ordering ${quantity} pizzas: ${mealCount}`);
    console.log(`Current item count: ${itemCount}`);        
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...