【问题标题】:broken code at .push in JS.JS 中 .push 处的代码损坏。
【发布时间】:2017-12-14 10:10:40
【问题描述】:

我似乎无法找到为什么我不能在 addDishToCourse 方法中将我的菜推送到课程 [courseName] .. courseName 是一个数组,所以不应该有任何问题(尽管事实上,这不是真的 >

const menu = {
    _courses : {
      _appetizers : [],
      _mains : [],
      _desserts : []
    },

>>    set appetizers(appetizerIn) {

    },
    get appetizers() {

    },
    set mains(mainIn) {

    },
    get mains() {

    },
    set desserts(dessertIn) {

    },
    get desserts() {

    },
    get courses() {
      return {
        appetizers : this._courses.appetizers,
        mains : this._courses.mains,
        desserts : this._courses.desserts
      }

    },
        //Below is where my code breaks with the .push 

    addDishToCourse(courseName, dishName, dishPrice) {
        let dish = {
        name : dishName,
        price : dishPrice  
      };
      this._courses[courseName].push(dish);

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

    generateRandomMeal() {
      const appetizer = this.getRandomDishFromCourse('appetizers');
      const main = this.getRandomDishFromCourse('mains');
      const dessert = this.getRandomDishFromCourse('desserts');
      //const totalPrice = appetizers.price + mains.price + desserts.price;

      return `Your appetizer is ${appetizers.name} followed by the main meal, which will be ${mains.name}, and finally you will have ${desserts.name} for dessert.`;// Your bill will be of ${totalPrice}.`;
    }

  };

  menu.addDishToCourse('appetizers', 'Caesar Salad', 3.75);
  menu.addDishToCourse('appetizers', 'Srimp Cocktail', 6.50);
  menu.addDishToCourse('appetizers', 'Escargots Gratines', 4.50);
  menu.addDishToCourse('mains', '16oz Ribeye', 38);
  menu.addDishToCourse('mains', 'Smoked Salmon', 18);
  menu.addDishToCourse('mains', 'Grilled Chicken Breast', 19);
  menu.addDishToCourse('desserts', 'Chocolate Lava Cake', 3.50);
  menu.addDishToCourse('desserts', 'Tiramisu', 4);
  menu.addDishToCourse('desserts', 'Kiev Cake', 6.50);

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

现在我尝试使用 if 语句绕过 .push,但这只是破坏了其他地方的代码。否则,我知道我可能会使用 setter 方法,但我也不太确定如何处理它。我会设置 addDishToCourse 吗?

我是一个新手(从简单的代码中可以看出^_^)所以任何帮助将不胜感激!

【问题讨论】:

  • "_something" !== "something"
  • 与此问题无关,但恕我直言,您的 getter 函数应该返回数组的副本,并且您的 setters 同样应该将传递的数组复制到本地数组中。否则,任何获得对您的内部数据的引用的此类客户端都可以就地修改它并破坏您的对象的封装。
  • 感谢@Alnitak!一旦我对它们感到更舒服,我肯定会修改我的设置器/获取器。没想到,对以后有用^_^

标签: javascript arrays methods undefined push


【解决方案1】:

当您创建新实例时,您的 courseName 需要与您的 _courses 对象中的键名相匹配。在您的代码中,所有这些名称前面都有一个下划线,因此代码会中断。

例如:

menu.addDishToCourse('appetizers', 'Caesar Salad', 3.75);

您将“开胃菜”作为课程名称传递...

addDishToCourse(courseName, dishName, dishPrice) {
  let dish = {
    name : dishName,
    price : dishPrice  
  };
  this._courses[courseName].push(dish);
},

...您正尝试将“开胃菜”添加到 _courses,但 _courses 只有 _appetizers 键名。

我会将您的对象键的名称分别更改为 appetizermainsdessert

【讨论】:

  • 我能否以某种方式不更改 _courses 键并将它们指向具有各自名称而不带 _ 的 setter/getter,然后调用它们?另外,尝试删除键值中的 _,现在我的 .legth 方法中断了,呵呵。所以我将其更改为dishs.length,但随后我的代码在${appetizers.name} 中中断,所以我将其更改为${menu._courses.appetizers.name},现在我得到了“你的开胃菜是……”这句话,但是所有的值都是未定义的。如果我太需要帮助,我真的很抱歉:(我只是想从书本上学习
  • _courses 对象上的下划线还不够吗?为什么键名也需要它们?
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2013-10-25
  • 2013-08-09
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多