module.exports = function Cart(oldCart) {
    this.items = oldCart.items || {};
    this.totalQty = oldCart.totalQty || 0;
    this.totalPrice = oldCart.totalPrice || 0;

    this.add = function(item, id, image) {
        let storedItem = this.items[id];
        if(!storedItem) {
            storedItem = this.items[id] = { item: item, image: image, qty: 0, price: 0, id: id};
        }
        storedItem.qty++;
        storedItem.price = storedItem.item.price * storedItem.qty;
        this.totalQty++;
        this.totalPrice += storedItem.item.price;
    };

    this.reduceByOne = function(id) {
        this.items[id].qty--;
        this.items[id].price -= this.items[id].item.price;
        this.totalQty--;
        this.totalPrice -= this.items[id].item.price;
        // minimum number 0
    };

    this.addByOne = function(id) {
        this.items[id].qty++;
        this.items[id].price += this.items[id].item.price;
        this.totalQty++;
        this.totalPrice += this.items[id].item.price;
    };

    this.removeItem = function(id) {
        this.totalQty -= this.items[id].qty;
        this.totalPrice -= this.items[id].item.price;
        delete this.items[id];
    };
    
    this.generateArray = function() {
        var arr = [];
        for (var id in this.items) {
            arr.push(this.items[id]);
        }
        return arr;
    };
}

Je me demandais ce qui pourrait être un moyen maintenable de forcer la fonction reduceByOne à avoir un nombre minimum de 0 (pas -1, -2 et ainsi de suite, ce qui se passe maintenant). Il devrait donc cesser de soustraire lorsqu'il atteint le nombre 0. Mais gardez à l'esprit que cette fonction ne devrait pas affecter les autres fonctions également. J'ai déjà écrit une condition dans this.reduceByOne function et la seule chose à faire maintenant est de vérifier si this.items[id].qty a le numéro 0.

-2
frontend 12 mars 2019 à 22:42

2 réponses

Meilleure réponse

Vérifiez simplement si la quantité de l'article est 0 et si c'est 0, retournez simplement, ne faites rien

this.reduceByOne = function(id) {
    if(this.items[id].qty == 0) return;
    this.items[id].qty--;
    this.items[id].price -= this.items[id].item.price;
    this.totalQty--;
    this.totalPrice -= this.items[id].item.price;
};
1
wang 12 mars 2019 à 20:12

Les fonctions qui effectuent la soustraction peuvent s'en occuper :

this.totalPrice = Math.max(0, this.totalPrice - this.items[id].item.price);

Au lieu de

this.totalPrice -= this.items[id].item.price;

Notez que Math.max ne couvre pas les NaN possibles.

Ou cela peut être fait avec des accesseurs :

get total() {
  return this._total || 0;
}

set total(v) {
  if (v >= 0)
    this._total = v;
}

Cela couvre également la valeur par défaut comme this.totalPrice = oldCart.totalPrice || 0.

0
Estus Flask 12 mars 2019 à 20:11