При удалении не последнего по счету элемента localStorage остается undefined

Сохраняю данные в localStorage, каждая запись хранит определенную строку, каждая запись имеет название с нумерацией, к примеру task1, task2 и так далее. На странице имееются кнопки, для удаления данных записей по одной. Проблема вот в чем, если я удаляю записи с последней, то все нормально, а если не последнюю, то после обновления страницы, она вновь появится, но строка уже будет undefined. Например: есть task1, task2 и task3, я удаляю task3, после обновления страницы она не появляется вновь, однако, если удалю task1 или/и task2, они восстановятся со строками undefined.

Функция Создания элемента на странице и запись его текста в localStorage:

export function CreateTask(text)
{
    if (document.getElementById('add-task-input') != null) {
        let taskDiv = document.createElement('div');
        let taskTextTag = document.createElement('p');
        let buttonTaskRemove = document.createElement('img');

        taskDiv.setAttribute('id', 'todo-task');
        buttonTaskRemove.setAttribute('id', 'button-task-remove');
        buttonTaskRemove.setAttribute('src', './remove-task-icon.png');
        taskTextTag.setAttribute('onclick', 'eval("' +
            'if (this.style.textDecoration == `line-through`) this.style.textDecoration = `none`;' +
            'else this.style.textDecoration = `line-through`")');
        taskTextTag.setAttribute('id', 'label-task');
        buttonTaskRemove.addEventListener('click', RemoveTaskButtonClick);

        if (text == '')
        {
            taskTextTag.innerHTML = document.getElementById('add-task-input').value;
            document.getElementById('add-task-input').value = '';
        }
        else
        {
            taskTextTag.innerHTML = text;
        }

        taskDiv.appendChild(taskTextTag);
        taskDiv.appendChild(buttonTaskRemove);
        document.getElementById('root').appendChild(taskDiv);

        countTask++;

        localStorage.setItem(`task${countTask}`, text);
    }
}

Функция загрузки записей из localStorage на страницу:

export function LoadTasks()
{
    if (localStorage.length != 0)
    {
        for (let i = 1; i < localStorage.length + 1; i++)
        {
            CreateTask(localStorage[`task${i}`]);
        }
    }
}

Функция удаления записи из localStorage:

function RemoveTaskButtonClick()
{
    for (let i = 1; i < localStorage.length + 1; i++)
    {
        if (localStorage[`task${i}`] == this.parentElement.innerText)
        {
            //delete localStorage[`task${i}`];
            window.localStorage.removeItem(`task${i}`);
        }
    }
    this.parentElement.remove();
}

Проект пишу на React.JS


Ответы (1 шт):

Автор решения: Igor

Во-первых. Итерировать по ключам localStorage, хранящим элементы массивов, - изначально порочный подход. Все развалится, когда Вам понадобится сохранить в localStorage что-нибудь еще.

Во-вторых. Храните весь массив элементов под одним ключом - как сериализованные данные. Удаляйте/добавляйте/изменяйте элементы в массиве - сохраняйте массив в localStorage на каждую такую операцию.

let arrTasks = [];
if (localStorage['myTasks'])
  arrTasks = JSON.parse(localStorage['myTasks']);

...

localStorage['myTasks'] = JSON.stringify(arrTasks);
→ Ссылка