Javascript 是什么导致我的代码不知道要从本地存储中删除哪个值?
我正在构建一个js web应用程序,允许用户添加到一个好习惯列表中,并根据自己的意愿删除它们。每天,应用程序都会随机选择一个供用户执行 我已经为应用程序构建了所有功能,但在实现本地存储时遇到了问题。当用户添加到习惯列表时,这些习惯将保存到本地存储。我遇到的问题是,当用户从列表中删除习惯时,相应的习惯不会从本地存储中删除。它似乎可以从本地存储中删除一些习惯,但不一定是用户单击的习惯 下面是一些代码:Javascript 是什么导致我的代码不知道要从本地存储中删除哪个值?,javascript,local-storage,Javascript,Local Storage,我正在构建一个js web应用程序,允许用户添加到一个好习惯列表中,并根据自己的意愿删除它们。每天,应用程序都会随机选择一个供用户执行 我已经为应用程序构建了所有功能,但在实现本地存储时遇到了问题。当用户添加到习惯列表时,这些习惯将保存到本地存储。我遇到的问题是,当用户从列表中删除习惯时,相应的习惯不会从本地存储中删除。它似乎可以从本地存储中删除一些习惯,但不一定是用户单击的习惯 下面是一些代码: class Goodhabit { constructor(goodHabit) {
class Goodhabit {
constructor(goodHabit) {
this.goodHabit = goodHabit;
}
}
class UI {
addGoodHabit(goodhabit, callback) {
const goodHabitList = document.getElementById('good-habit-list');
// Create tr element
const goodHabitRow = document.createElement('tr');
// Insert html
goodHabitRow.innerHTML = `
<td class="good-habit">${goodhabit.goodHabit}</td>
<td class="remove" id="remove">✕</td>
`;
// Add row to list
goodHabitList.appendChild(goodHabitRow);
if(callback) {
callback();
}
}
removeGoodHabit(target, callback) {
if(target.id === 'remove') {
target.parentElement.remove();
callback();
}
}
}
class Store {
static getGoodHabits() {
let goodhabitsls;
if(localStorage.getItem('goodhabitsls') === null) {
goodhabitsls = [];
} else {
goodhabitsls = JSON.parse(localStorage.getItem('goodhabitsls'));
}
return goodhabitsls
}
static displayGoodHabits() {
const goodhabitsls = Store.getGoodHabits()
goodhabitsls.forEach(function(goodhabit) {
// Instantiate ui
const ui = new UI;
// Add good habit to ui
ui.addGoodHabit(goodhabit)
})
}
static addGoodHabitToLs(goodhabit) {
const goodhabitsls = Store.getGoodHabits()
goodhabitsls.push(goodhabit);
localStorage.setItem('goodhabitsls', JSON.stringify(goodhabitsls));
}
static removeGoodHabitFromLs(habit) {
const goodhabitsls = Store.getGoodHabits()
goodhabitsls.forEach(function(goodhabit, index) {
if(goodhabit = habit) {
goodhabitsls.splice(index, 1);
}
});
localStorage.setItem('goodhabitsls', JSON.stringify(goodhabitsls));
}
}
// Event Listener For Adding A Good Habit
document.getElementById('button-good-habit').addEventListener('click', function(e) {
// Get form value
const goodHabit = document.getElementById('good-habit-input').value;
// Instantiate good habit
const goodhabit = new Goodhabit(goodHabit);
// Instantiate UI
const ui = new UI();
// Validate
if(goodHabit === '') {
// Code that displays warning
} else {
// add good habit to list
ui.addGoodHabit(goodhabit, goodHabitsNode);
// add to ls
Store.addGoodHabitToLs(goodhabit)
// clear fields
ui.clearFields();
}
});
// Event Listener For Removing A Good Habit
document.getElementById('good-habit-list').addEventListener('click', function(e) {
// Instantiate UI
const ui = new UI();
// Remove good habit from list
ui.removeGoodHabit(e.target, goodHabitsNode);
// Remove from ls
Store.removeGoodHabitFromLs(e.target.previousElementSibling.textContent)
});
如果好习惯=习惯{
使用两个等号==进行比较。现在,您在forEach中分配GoodHabity,而不是检查其值,因此每次迭代都会拼接出另一个元素
编辑:
正如在评论中所讨论的,比较也不起作用,因为goodhabitsls是一个对象数组,而不是字符串
解决方案是将对象的属性与参数进行比较,而不是将对象本身进行比较:
IfGoodBattage.GoodBattage==习惯{
感谢您的回复!最初我使用===然后==但是,当我执行此操作时,不会从本地存储中删除任何内容。@BoJack嗯,重新分配参数肯定不是解决此问题的方法。如果您的条件永远不为真,则传入的习惯一定不正确。您可以尝试在外部使用console.log或AlertHabity调试此问题循环。在forEach之后,如果我console.loggoodhabity,我会得到{goodhabity:aaa}如果我是console.loghabity,我只得到aaa。我想这可能与此有关,因为一个是对象,另一个只是文本?@BoJack再次检查,看起来你在localStorage中填充的列表是good Habity对象,而不是字符串。所以检查GoodHabity==Habity,其中Habity是字符串,GoodHabity是对象,就是d很可能会失败。也许你可以试试ifgoodhabit.goodHabit==习惯?我们有一个解决办法!谢谢你的帮助