значение объекта увеличивается только в первом элементе массива - PullRequest
0 голосов
/ 09 апреля 2020

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

  1. Только увеличивается значение первого элемента массива
  2. Если я выбираю любой другой код элемента, он снова выбирает первый элемент и увеличивает значение в первом элементе

// Constructor For Products
    
    var item = function(name,itemCode,stock){
        this.name = name;
        this.itemCode = itemCode;
        this.stock = stock;
    }
    
    var data = [];
    
    function addItem(name,itemCode,stock){
        if (data.map(i => i.itemCode).includes(itemCode)) return alert('you enter a duplicate itemcode'),menu();
        var Newitem = new item(name,itemCode,stock);
        data.push(Newitem);
    }
    
    
    //Delete item
function delItem(n){
    if (data.map(i => i.itemCode).includes(n)){
        var getIndex = data.indexOf(n)+1;
        data.pop(getIndex);
    }else{
        alert('This item is not in the database')
    }
    }
    
 
   
    
    
    //Increase stock
     item.prototype.inc = function(j){
        return this.stock = this.stock + j;
    }
    function incItem(n,val){
    if (data.map(i => i.itemCode).includes(n)){
        var getIndex = data.indexOf(n)+1;
        let lmn = data[getIndex].inc(val);
         return lmn;
    }else{
        alert('This item is not in the database')
    }
    }
    
    
    addItem('BlueTee',100,50);
    addItem('Yellow tee',101,100);
    addItem('BrownTee',102,120);

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Если вы действительно учитесь изучать основы c из class, methods. Ищите array.find реализацию.

Ниже приведенного кода вы можете обозначить его как небольшую очистку.

class Item {
  constructor(name, itemCode, stock) {
    this.name = name;
    this.itemCode = itemCode;
    this.stock = stock;
    this.list = [];
  }
  inc(n) {
    return (this.stock += n);
  }
}
class ItemInventory {
  constructor() {
    this.list = [];
  }

  addItem(name, itemCode, stock) {
    const item = this.list.find((item) => item.itemCode === itemCode);
    if (item) return alert("you enter a duplicate itemcode"), menu();
    this.list.push(new Item(name, itemCode, stock));
  }
  findAndInc(n, val) {
    const item = this.list.find((item) => item.itemCode === val);
    if (item) {
      item.inc(n);
      return item;
    } else {
      alert("This item is not in the database");
    }
  }
}
const inventory = new ItemInventory();
inventory.addItem("BlueTee", 101, 50);
inventory.addItem("Yellow tee", 102, 38);
inventory.addItem("Brown tee", 103, 89);
console.log(inventory.list);
inventory.findAndInc(5, 101);
console.log(inventory.list);
1 голос
/ 09 апреля 2020

Вы слишком усложняете проблему. Например, вы можете использовать find(), чтобы получить первый элемент в массиве, а затем просто увеличить его свойство stock на val, что-то вроде:

data = [
  { name: "BlueTee", itemCode: 100, stock: 50 },
  { name: "Yellow tee", itemCode: 101, stock: 100 },
  { name: "BrownTee", itemCode: 102, stock: 120 },
];

function incItem(n, val) {
  let item = data.find((p) => p.itemCode === n);
  if (item) {
    item.stock += val;
    return item;
  } else {
    console.log("This item is not in the database");
  }
}

console.log(incItem(102, 5));
incItem(666, 10);
...