#javascript #json
Вопрос:
Я сохраняю свои товары, которые принадлежат корзине покупок, в локальном хранилище. У всего один и тот же ключ. Я использую следующий код:
for (let i = 0; i<produkt.length; i ) {
.
.
.
document.querySelector('a.produktlöschen' [i]).addEventListener('click', ()=>{
const parsed = JSON.parse(localStorage.getItem('warenkorb'));
parsed.splice(parsed.indexOf(i), 1);
localStorage.setItem('warenkorb', JSON.stringify(parsed));
location.reload();
цикл » для » предназначен для динамической корзины покупок. product1
это i=0
, product2
это i=1
…
Мой план состоит в том, что при нажатии на Якорь product[I]
(зависит от того, какой якорь) удаляется.
С моим кодом удаляется только последний элемент, а не тот, на который нажата привязка.
let produkt = [
{
name: '3er Set Bambuszahnbürste',
preis: 10,
marke: 'LifePanda',
seit: 2020,
bild_url: '../img/Produkt_1.jpg',
id: 1
},
{
name: 'Nachhaltiges Einkaufsnetz',
preis: 19,
marke: 'GreenEarth',
seit: 2019,
bild_url: '../img/Produkt_2.jpg',
id: 2
}];
Комментарии:
1. Когда вы нажмете, что ваш i уже прошел цикл, возьмите объект отправителя в обработчике событий, чтобы определить, какой проект следует удалить.
2. используйте один и тот же массив объектов для всех продуктов, а также используйте делегирование событий для более четкого кода
3. Лучше, если все элементы будут храниться в массиве объектов. Когда вы удаляете элемент, удалите его из массива, а затем сохраните массив в локальном хранилище. Лучше, чем разбирать строковый объект и снова строчить его при изменении продуктов(это требует так много обработки).
4. проанализировано.indexOf(i) не имеет смысла. Это должен быть жучок
5. в объектах нет числового индекса, это не объект массива.
Ответ №1:
Используйте ОБЪЕКТ
У вас возникли проблемы со ссылкой (получением индекса) на элемент массива, который вы хотели удалить. Лучший способ — напрямую использовать объект вместо массива. Таким образом, вы можете называть их по имени, которое вы им присвоили, вместо того, чтобы искать способ получить индекс нужного вам элемента.
// Using an object you can just directly assign an id that you can call anytime
const obj = {}
obj['a12e'] = {...} // obj = {a12e:{...}} // add new properties
obj.a12e.name = ... // change properties
delete obj.a12e = //delete properties
Не извлекайте свои данные из локального хранилища
Также лучше, если все элементы будут храниться в Массиве Объектов или Объектов (зависит от ваших предпочтений). Таким образом, при удалении элемента вы можете удалить его из массива, а затем сохранить массив в локальном хранилище. Лучше, чем разбирать строковый объект и снова строчить его при изменении продуктов(это отнимает так много времени).
Давайте тогда сравним понятия
Изменение элемента непосредственно из локального хранилища:
0# onclick
1# получить JSON из локального хранилища
2# проанализировать JSON в массив
3# удалить элемент из массива
4# преобразовать массив в строковый JSON
5# сохранить строковый JSON в локальном хранилищеИзменение элемента в массиве/объекте:
0# onclick
1# удалить элемент из массива/объекта
2# преобразовать массив/объект в строковый JSON
3# сохранить строковый JSON в локальное хранилище
Пример
// HTML
<div class=item id=item0><span>Cheese cake </span><button class=remove>x</button></div>
<div class=item id=item1><span>Chocolate cake </span><button class=remove>x</button></div>
<div class=item id=item2><span>Strawberry cake </span><button class=remove>x</button></div>
<div class=item id=item3><span>Double Chocolate cake </span><button class=remove>x</button></div>
// JavaScript
const productItemsObject = {}
localStorage.setItem('products', JSON.stringify(productItemsObject))
for (let items of document.querySelectorAll('.item')) {
productItemsObject[items.id]={name: items.children[0].innerText} // store everything in an object
items.children[1] /*button*/ .addEventListener('click', function() {
//Using an Object
delete productItemsObject[items.id] // remove item from array
localStorage.setItem('productsObj', JSON.stringify(productItemsObject)) // update the data in localStorage only after every change
items.remove()
console.log("Object",localStorage.productsObj)
})
}