Корзина удаления товара и применения купона в js
Я пытаюсь удалить товар без удаления корзины и снизить цену, если у клиента есть купон или превышено определенное количество, пока js до использования Django вот html код js если у вас есть совет не стесняйтесь
html
<div data-name="name" data-price="250" data-id="2">
<img src="x.jpg" alt="" />
<h3>name</h3>
<input type="number" class="count" value="1" />
<button class="tiny">Add to cart</button>
</div>
<script type="text/template" id="cartT">
<% _.each(items, function (item) { %> <div class = "panel"> <h3> <%= item.name %> </h3> <span class="label">
<%= item.count %> piece<% if(item.count > 1)
{%>s
<%}%> for <%= item.total %>$</span > </div>
<% }); %>
</script>
js
addItem: function (item) {
if (this.containsItem(item.id) === false) {
this.items.push({
id: item.id,
name: item.name,
price: item.price,
count: item.count,
total: item.price * item.count
});
storage.saveCart(this.items);
} else {
this.updateItem(item);
}
this.total += item.price * item.count;
this.count += item.count;
helpers.updateView();
},
containsItem: function (id) {
if (this.items === undefined) {
return false;
}
for (var i = 0; i < this.items.length; i++) {
var _item = this.items[i];
if (id == _item.id) {
return true;
}
}
return false;
},
updateItem: function (object) {
for (var i = 0; i < this.items.length; i++) {
var _item = this.items[i];
if (object.id === _item.id) {
_item.count = parseInt(object.count) + parseInt(_item.count);
_item.total = parseInt(object.total) +parseInt(_item.total);
this.items[i] = _item;
storage.saveCart(this.items);
}
}
}
Вы можете использовать функцию фильтра для удаления элемента, таким образом вы удалите только тот элемент, который содержит определенный идентификатор.
removeItem(id) {
this.items = this.items.filter(item => item.id !== id);
}
Для применения купона, если только у вас нет всех купонов, хранящихся в вашем front-end, вы должны сделать вызов HTTPS, чтобы проверить, действителен ли купон или нет, а также его значение, чтобы затем применить скидку в корзине.
Предложение к вашему коду связано с функцией containsItem, в которой вы итерационно просматриваете весь массив и проверяете id каждого элемента по отдельности, а затем возвращаете пользователю. Вы можете использовать функцию some, чтобы позволить JS проверить это за вас.
containsItem: function (id) {
return this.items?.some(item => item.id === id);
}
//PS: the ?. is a notion that checks if the variable exists and if it's true it continues, that way you won't have an undefined error. It is called [Optional Chaining][2]
Другое предложение - в updateItem вы можете получить нужный вам элемент с помощью функции find.
updateItem: function (object) {
const itemToUpdate = this.items.find(item => item.id === object.id);
if(itemToUpdate) {
itemToUpdate.count = parseInt(object.count) + parseInt(itemToUpdate.count);
itemToUpdate.total = parseInt(object.total) +parseInt(itemToUpdate.total);
storage.saveCart(this.items);
}
}
Кроме того, вам не нужно переназначать массив, поскольку когда вы ссылаетесь на объект, он будет обновлен и на его источнике.