0

I have completed a JS project that creates a menu, populates it with appetizers, mains and desserts including their price and stores in arrays in menu object. A random selection of appetizers, mains and desserts can be called along with the total price of the meal.

This code works fine but it is not what i want:

const menu = {
  _courses: {
    appetizers: [],
    mains:[],
    desserts:[]
  },
  get appetizers(){
    return this._courses.appetizers;
  },
  get mains(){
    return this._courses.mains;
  },
  get desserts(){
    return this._courses.desserts;
  },
  set appetizers(appetizers) {
    this._courses.appetizers = appetizers;
  },
  set mains(mains) {
    this._courses.mains = mains;
  },
  set desserts(desserts) {
    this._courses.desserts = desserts;
  },
  get courses() {
    return {
      appetizers: this._courses.appetizers,
      mains: this._courses.mains,
      desserts: this._courses.desserts
    };
    },

    addDishToCourse(courseName, dishName, dishPrice) {
      let dish = {
        name: dishName,
        price: dishPrice
      };

      this._courses[courseName].push(dish);
    },

    getRandomDishFromCourse(courseName) {
      let dishes = this._courses[courseName];
      let randomIndex = Math.floor(Math.random() * dishes.length);
      return dishes[randomIndex];
    },

generateRandomMeal() {    
    let appetizer = this.getRandomDishFromCourse('appetizers');
    let main = this.getRandomDishFromCourse('mains');
    let dessert = this.getRandomDishFromCourse('desserts');
    let totalCost = appetizer.price + main.price + dessert.price;
    
    return `Your meal is ${appetizer.name}, ${main.name} and ${dessert.name} and it costs £${totalCost.toFixed(2)}.`;
    },

};

menu.addDishToCourse('appetizers', 'prawncocktail', 4.75);
menu.addDishToCourse('appetizers', 'soup', 3.77);
menu.addDishToCourse('appetizers', 'bread and butter', 1.25);

menu.addDishToCourse('mains', 'steak', 11.75);
menu.addDishToCourse('mains', 'vegetarian', 9.75);

menu.addDishToCourse('desserts', 'ice cream', 3.99);
menu.addDishToCourse('desserts', 'cheese and biscuits', 2.99);

let meal = menu.generateRandomMeal();
console.log(meal);

I want _appetizers: [] not appetizers: []

I have tried to find online documentation to help but so far have failed!

Adding the underscore "_" to appetizers _appetizers in _courses and in the get and set methods causes an error.

This code throws a TypeError

const menu = {
  _courses: {
    _appetizers: [],
    mains:[],
    desserts:[]
  },
  get appetizers(){
    return this._courses._appetizers;
  },
  get mains(){
    return this._courses.mains;
  },
  get desserts(){
    return this._courses.desserts;
  },
  set appetizers(appetizers) {
    this._courses._appetizers = appetizers;
  },
  set mains(mains) {
    this._courses.mains = mains;
  },
  set desserts(desserts) {
    this._courses.desserts = desserts;
  },
  get courses() {
    return {
      appetizers: this._courses._appetizers,
      mains: this._courses.mains,
      desserts: this._courses.desserts
    };
    },

    addDishToCourse(courseName, dishName, dishPrice) {
      let dish = {
        name: dishName,
        price: dishPrice
      };

      this._courses[courseName].push(dish);
    },

    getRandomDishFromCourse(courseName) {
      let dishes = this._courses[courseName];
      let randomIndex = Math.floor(Math.random() * dishes.length);
      return dishes[randomIndex];
    },

generateRandomMeal() {    
    let appetizer = this.getRandomDishFromCourse('appetizers');
    let main = this.getRandomDishFromCourse('mains');
    let dessert = this.getRandomDishFromCourse('desserts');
    let totalCost = appetizer.price + main.price + dessert.price;
    
    return `Your meal is ${appetizer.name}, ${main.name} and ${dessert.name} and it costs £${totalCost.toFixed(2)}.`;
    },

};

menu.addDishToCourse('appetizers', 'prawncocktail', 4.75);
menu.addDishToCourse('appetizers', 'soup', 3.77);
menu.addDishToCourse('appetizers', 'bread and butter', 1.25);

menu.addDishToCourse('mains', 'steak', 11.75);
menu.addDishToCourse('mains', 'vegetarian', 9.75);

menu.addDishToCourse('desserts', 'ice cream', 3.99);
menu.addDishToCourse('desserts', 'cheese and biscuits', 2.99);

let meal = menu.generateRandomMeal();
console.log(meal);

Error:

/home/ccuser/workspace/learn-javascript-objects-meal-maker/app.js:39
      this._courses[courseName].push(dish);
                               ^

TypeError: Cannot read property 'push' of undefined
    at Object.addDishToCourse (/home/ccuser/workspace/learn-javascript-objects-meal-maker/app.js:39:32)```

2 Answers 2

1

You should add the underscore when you call addDishToCourse as well:

menu.addDishToCourse('_appetizers', 'prawncocktail', 4.75);
menu.addDishToCourse('_appetizers', 'soup', 3.77);
menu.addDishToCourse('_appetizers', 'bread and butter', 1.25);

Otherwise, courseName is 'appetizers' (no underscore) and accessing this._courses[courseName] = this._courses['appetizers'] results in undefined:

this._courses['appetizers'].push(dish);
             ^^^^^^^^^^^^^^
Sign up to request clarification or add additional context in comments.

1 Comment

ok thank you - i see now ( having run it with commented out get and set methods) that they are not part of the flow.
0

You're using 'appetizers' as the key here:

menu.addDishToCourse('appetizers', 'prawncocktail', 4.75);

, but the _courses object doesn't have it. You can change it to '_appetizers'.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.