【问题标题】:How do I increment and decrement values in an object using JavaScript Classes?如何使用 JavaScript 类增加和减少对象中的值?
【发布时间】:2021-05-06 03:39:14
【问题描述】:

我正在尝试做一个简单的 Backpack 类来使用 vanilla javascript 查看对象。这样做时,我遇到了一个障碍,因为我无法创建正确的 AddItem 方法或让我的 decrementItem 方法工作。

我的代码如下:

class Backpack {
  constructor(name) {
    this.name = name;
    this.items = {};
  }

  name() {
    return `My backpack's name is ${this.name}`;
  }

  addItem(i, value) {
    return this.items[i] ? (this.items[i] += value) : (this.items[i] = 1);
  }

  decrementItem(i) {
    if (this.items[i]) {
    }
    return this.items[i] ? this.items[i]-- : (this.items[i] = 0);
  }
}

let newBackpack = new Backpack("Bacon");

newBackpack.addItem("pencil", 3);
newBackpack.addItem("book");
newBackpack.addItem("pen");
newBackpack.addItem("paper");

console.log(newBackpack.items);

我也很好奇如何向我的 decrementItem 方法添加验证以检查值是否不会变为负数,因为这会导致一些问题。

【问题讨论】:

  • 您需要将项目存储在对象中吗?或者你可以使用一个简单的数组?
  • 我正在尝试为练习面试问题做对象
  • 当你将值 3 传递给 addItem 时,你的意图是什么?您是否关心索引 3 处是否已经有一个项目?您是否关心索引中低于 3 的项目? (为什么不检查下一个可用索引,然后在该索引处添加项目,而不是尝试手动跟踪索引?)

标签: javascript nan object-notation


【解决方案1】:

我猜这对你的采访可能看起来不错

class Backpack {
  constructor(name){
    this.name=name
    this.items={}
    this.removeItem=function(item){
      item=item.toLowerCase()
      if(this.items[item]){delete(this.items[item])}
      else{throw Error("Cannot delete a NON-EXISTING attribute "+item)}
    }
    this.minusItem=function(item,number){
      item=item.toLowerCase()
      if(this.items[item]){this.items[item]-=number||1}
      else{throw Error("Cannot Subtract from a NON-EXISTING attribute "+item)}
    }
    this.addItem=function(item,number){
      item=item.toLowerCase()
      if(this.items[item]){this.items[item]+=number||1}
      else{this.items[item]=number||1}
    }
    this.getCountOfItems=function(item){
      item=item.toLowerCase()
      return this.items[item]||null
    }
  }
}

let newBackpack = new Backpack("Bacon");

newBackpack.addItem("pencil",3);
newBackpack.addItem("pencil",5);
newBackpack.minusItem("pencil",2);
newBackpack.addItem("book");
newBackpack.addItem("pen");
newBackpack.addItem("paper");

console.log(newBackpack.items);
console.log(newBackpack.getCountOfItems("pencil")) //6
console.log(newBackpack.getCountOfItems("lunchbox")) //null representing it not existing

try{newBackpack.minusItem("lunchbox",2)}
catch(err){console.error(err.message)}

try{console.log(newBackpack.removeItem("lunchbox"))}
catch(err){console.error(err.message)}

【讨论】:

    【解决方案2】:

    您可以添加这些更改:

    • i 通常在循环中用于引用数字索引。目前尚不清楚您是否将其用于项目名称。将此变量命名为 item 可能更有意义。
    • addItem中,当没有该项目开始时,总是添加1,丢弃传递的value。确保添加值
    • addItem 中,value 似乎是一个可选参数。您可以添加默认值1
    • 更改数量时,您可以使用此速记来确保使用先前的值,或者在没有值或已经为零时为零:this.items[item] || 0
    • Math.max(n, 0) 将允许您确保没有值低于零

    class Backpack {
      constructor(name) {
        this.name = name;
        this.items = {};
      }
    
      name() {
        return `My backpack's name is ${this.name}`;
      }
    
      addItem(item, value = 1) { // 1 by default if not provided
        return this.items[item] = (this.items[item] || 0) + value; // Add the value
      }
    
      decrementItem(item) {
        return this.items[item] = Math.max((this.items[item] || 0) - 1, 0); // 0 minimum
      }
    }
    
    let newBackpack = new Backpack("Bacon");
    
    newBackpack.addItem("pencil", 3);
    newBackpack.decrementItem("pencil");
    newBackpack.addItem("book");
    newBackpack.addItem("pen");
    newBackpack.addItem("paper");
    
    console.log(newBackpack.items);

    【讨论】:

      【解决方案3】:

      您必须先将项目保存到构造函数

      class Backpack {
        constructor(name) {
          this.name = name;
          this.items = {};
        }
      
        name() {
          return `My backpack's name is ${this.name}`;
        }
      
        addItem(i, value) {
          this.items[i] = value ? value : 1;
        }
      
        decrementItem(i) {
          if (this.items[i]) {
            this.items[i] = this.items[i] - 1;
          } else {
            console.log(`Item not found !!`);
          }
        }
      }
      
      let newBackpack = new Backpack("Bacon");
      
      newBackpack.addItem("pencil", 3);
      newBackpack.addItem("book");
      newBackpack.addItem("pen");
      newBackpack.addItem("paper");
      
      newBackpack.decrementItem("pencil");
      
      console.log(newBackpack.items);
      

      【讨论】:

        猜你喜欢
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多