有没有一种方法可以将多个相同的对象添加到购物车?

时间:2019-07-31 19:00:31

标签: javascript html shopping-cart

我正在为网上商店的购物车编程,尽管我已经弄清楚了大部分,但当我将2件相同商品添加到购物车中时,它在列表中显示2次,而不是2次,但是价钱。在没有改变我已经完成的大部分工作的情况下,有什么方法可以解决这个问题?

body {
  background: #97CE98;
}

.btn-group {
  display: grid;
  grid-template-columns: 4;
  grid-row: 5 minmax(100px, auto);
  grid-gap: 5px;
}

.one {
  grid-column: 1/4;
  grid-row: 1;
  display: flex;
}

.two {
  grid-column: 2/4;
  grid-row: 1;
  display: flex;
}

.three {
  grid-column: 3/4;
  grid-row: 1;
  display: flex;
}

.four {
  grid-column: 4/4;
  grid-row: 1;
  display: flex;
}

.five {
  grid-column: 1/4;
  grid-row: 2;
  display: flex;
}

.six {
  grid-column: 2/4;
  grid-row: 2;
  display: flex;
}

.seven {
  grid-column: 3/4;
  grid-row: 2;
  display: flex;
}

.eight {
  grid-column: 4/4;
  grid-row: 2;
  display: flex;
}

.nine {
  grid-column: 1/4;
  grid-row: 3;
  display: flex;
}

.ten {
  grid-column: 2/4;
  grid-row: 3;
  display: flex;
}

.eleven {
  grid-column: 3/4;
  grid-row: 3;
  Display: flex;
}

.twelve {
  grid-column: 4/4;
  grid-row: 3;
  display: flex;
}

.thirteen {
  grid-column: 1/4;
  grid-row: 4;
  display: flex;
}

.fourteen {
  grid-column: 2/4;
  grid-row: 4;
  display: flex;
}

.fifteen {
  grid-column: 3/4;
  grid-row: 4;
  display: flex;
}

.sixteen {
  grid-column: 4/4;
  grid-row: 4;
  display: flex;
}

.seventeen {
  grid-column: 1/4;
  grid-row: 5;
  display: flex;
}
<!-- removed all the "onclick" attributes as this (attaching event listeners) will be placed in the JavaScript part -->

<!-- added a class of "btn-click-count" to all the buttons that will have counters -->

<p align="center">TPG Product Counter</p>
<div align="center" class="btn-group">
  <div class="one">
    <button class="btn-click-count" style="width:20%" id="demo1">Minced Hot 8oz </button>
  </div>
  <div class="two">
    <button class="btn-click-count" style="width:20%" id="demo2">Minced Hot 16oz </button>
  </div>
  <div class="three">
    <button class="btn-click-count" style="width:20%" id="demo3">Mindced Hot 24oz </button>
  </div>
  <div class="four">
    <button class="btn-click-count" style="width:20%" id="demo4">Chunky Hot 8oz </button>
  </div>
  <div class="five">
    <button class="btn-click-count" style="width:20%" id="demo5">Chunky Hot 16oz </button>
  </div>
  <div class="six">
    <button class="btn-click-count" style="width:20%" id="demo6">Chunky Hot 24oz </button>
  </div>
  <div class="seven">
    <button class="btn-click-count" style="width:20%" id="demo7">Hot Minced 8oz </button>
  </div>
  <div class="eight">
    <button class="btn-click-count" style="width:20%" id="demo8">Hot Minced 8oz </button>
  </div>
  <div class="nine">
    <button class="btn-click-count" style="width:20%" id="demo9">Hot Minced 8oz </button>
  </div>
  <div class="ten">
    <button class="btn-click-count" style="width:20%" id="demo10">Hot Minced 8oz </button>
  </div>
  <div class="eleven">
    <button class="btn-click-count" style="width:20%" id="demo11">Hot Minced 8oz </button>
  </div>
  <div class="twelve">
    <button class="btn-click-count" style="width:20%" id="demo12">Hot Minced 8oz </button>
  </div>
  <div class="thirteen">
    <button class="btn-click-count" style="width:20%" id="demo13">Hot Minced 8oz </button>
  </div>
  <div class="fourteen">
    <button class="btn-click-count" style="width:20%" id="demo14">Hot Minced 8oz </button>
  </div>
  <div class="fifteen">
    <button class="btn-click-count" style="width:20%" id="demo15">Hot Minced 8oz </button>
  </div>
  <div class="sixteen">
    <button class="btn-click-count" style="width:20%" id="demo16">Hot Minced 8oz </button>
  </div>
  <div class="seventeen">
    <button class="btn-click-count" style="width:20%" id="demo17">Hot Minced 8oz </button>
  </div>
</div>
window.onload = function () {
            var baseDeDatos = [
                {
                    id: 1,
                    nombre: 'Trim',
                    precio: 1399,
                    categoria: 'Buzo',
                    img: 'img/1.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 2,
                    nombre: 'Rainbow',
                    precio: 990,
                    categoria: 'Buzo',
                    img: 'img/2.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 3,
                    nombre: 'White',
                    precio: 948,
                    categoria: 'Buzo',
                    img: 'img/3.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 4,
                    nombre: 'Cycle',
                    precio: 550,
                    categoria: 'Buzo',
                    img: 'img/4.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 5,
                    nombre: 'Cellie',
                    precio: 590,
                    categoria: 'Buzo',
                    img: 'img/5.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 6,
                    nombre: 'Leo',
                    precio: 2890,
                    categoria: 'Buzo',
                    img: 'img/6.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 7,
                    nombre: 'Today',
                    precio: 499,
                    categoria: 'Buzo',
                    img: 'img/7.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 8,
                    nombre: 'Sky',
                    precio: 499,
                    categoria: 'Buzo',
                    img: 'img/8.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 9,
                    nombre: 'Regan',
                    precio: 590,
                    categoria: 'Buzo',
                    img: 'img/9.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 10,
                    nombre: 'Polly',
                    precio: 1399,
                    categoria: 'Remera',
                    img: 'img/10.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 11,
                    nombre: 'June',
                    precio: 799,
                    categoria: 'Remera',
                    img: 'img/11.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 12,
                    nombre: 'Amy',
                    precio: 1299,
                    categoria: 'Remera',
                    img: 'img/12.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 13,
                    nombre: 'Tai',
                    precio: 648,
                    categoria: 'Top',
                    img: 'img/13.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 14,
                    nombre: 'Judy',
                    precio: 3290,
                    categoria: 'Remera',
                    img: 'img/14.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                {
                    id: 15,
                    nombre: 'Grey',
                    precio: 1090,
                    categoria: 'Top',
                    img: 'img/15.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                  {
                    id: 16,
                    nombre: 'Pinky',
                    precio: 1090,
                    categoria: 'Top',
                    img: 'img/16.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                  {
                    id: 17,
                    nombre: 'Line',
                    precio: 1090,
                    categoria: 'Top',
                    img: 'img/17.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                },
                  {
                    id: 18,
                    nombre: 'Line',
                    precio: 1090,
                    categoria: 'Buzo',
                    img: 'img/18.jpg',
                    descripcion: 'Buzo con diseño colorblock neon.'
                }

            ]
            
            var $items = document.querySelector('#items');
            var carrito = [];
            var total = 0;
            var $carrito = document.querySelector('#carrito');
            var $total = document.querySelector('#total');

            function renderItems () {
                for (var info of baseDeDatos) {

                    var miNodo = document.createElement('div');
                    miNodo.classList.add('card', 'col-md-6');
                    
                    var miNodoCardBody = document.createElement('div');
                    miNodoCardBody.classList.add('card-body');

                    var miNodoTitle = document.createElement('h5');
                    miNodoTitle.classList.add('card-title');
                    miNodoTitle.textContent = info['nombre'] + ' / ' + info['categoria'];
                    
                    var miNodoImg = document.createElement('img');
                    miNodoImg.classList.add('card-text');
                    miNodoImg.src = info['img'];
                    
                    var miNodoDesc = document.createElement('p');
                    miNodoDesc.classList.add('card-text');
                    miNodoDesc.textContent = info['descripcion'];

                    var miNodoPrecio = document.createElement('h5');
                    miNodoPrecio.classList.add('card-text');
                    miNodoPrecio.textContent = '$' +info['precio'];

                    var miNodoBoton = document.createElement('button');
                    miNodoBoton.classList.add('btn', 'btn-primary');
                    miNodoBoton.textContent = 'Agregar al carrito';
                    miNodoBoton.setAttribute('marcador', info['id']);
                    miNodoBoton.addEventListener('click', anyadirCarrito);

                    miNodoCardBody.appendChild(miNodoImg);
                    miNodoCardBody.appendChild(miNodoTitle);
                    miNodoCardBody.appendChild(miNodoDesc);
                    miNodoCardBody.appendChild(miNodoPrecio);
                    miNodoCardBody.appendChild(miNodoBoton);
                    miNodo.appendChild(miNodoCardBody);
                    $items.appendChild(miNodo);
                }
            }
            function anyadirCarrito () {
                carrito.push(this.getAttribute('marcador'))
                calcularTotal();
                renderizarCarrito();

            }

            function renderizarCarrito () {
                $carrito.textContent = '';
                carrito.forEach(function (item, indice) {
                    var miItem = baseDeDatos.filter(function(itemBaseDatos) {
                        return itemBaseDatos['id'] == item;
                    });
                    var miNodo = document.createElement('li');
                    miNodo.classList.add('list-group-item', 'text-right');
                    miNodo.textContent = `${miItem[0]['nombre']} - $${miItem[0]['precio']}`;
                    var miBoton = document.createElement('button');
                    miBoton.classList.add('btn', 'btn-danger', 'mx-5');
                    miBoton.textContent = 'X';
                    miBoton.setAttribute('posicion', indice);
                    miBoton.addEventListener('click', borrarItemCarrito);
                    miNodo.appendChild(miBoton);
                    $carrito.appendChild(miNodo);
                })
            }

            function borrarItemCarrito () {
                var posicion = this.getAttribute('posicion');
                carrito.splice(posicion, 1);
                renderizarCarrito();
                calcularTotal();
            }

            function calcularTotal () {
                total = 0;
                for (var item of carrito) {
                    var miItem = baseDeDatos.filter(function(itemBaseDatos) {
                        return itemBaseDatos['id'] == item;
                    });
                    total = total + miItem[0]['precio'];
                }
                var totalDosDecimales = total.toFixed(2);
                $total.textContent = totalDosDecimales;
            }
            renderItems();
        } 

1 个答案:

答案 0 :(得分:0)

在添加商品之前,尝试检查商品是否已经在购物车中。

在此行carrito.push(this.getAttribute('marcador'))之前,按ID检查项目是否在carrito数组中,如果是,则遵循您的逻辑,如果不是,请执行以下操作-添加功能以将项目价格提高到现有价格对于该产品(不要加倍,因为有可能第三次或第四次添加相同的商品)。