Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789

LocalStorage - как организовать перебор элементов по определенному признаку через цикл for

09.01.2019, 21:16. Показов 4377. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например, есть localStorage и в нем находится несколько объектов - это товары.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*Наполняем корзину товаров*/
function fillShoppingCart() {
    /*товар, который просматривает пользователь в магазине*/
    var viewItem1 = {
        id: "№1",
        name: "Смартфон LG G4",
        /*дата в текущий момент*/
        dateView: moment().format() /* дата просмотра товара в интернет-магазине*/
    };
 
    var viewItem2 = {
        id: "№2",
        name: "Смартфон Samsung G7",
        dateView: moment().format() /* дата просмотра товара в интернет-магазине*/
    };
 
    /*сохраняем, просматриваемый в данный момент пользователем товар в хранилище*/
    localStorage.setItem(viewItem1.id, JSON.stringify(viewItem1));
    localStorage.setItem(viewItem2.id, JSON.stringify(viewItem2));
 
}

Нужно по временному признаку удалять объекты, например, если объекты находятся больше минуты.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
* Удаляем старые записи*/
function controlSizeLocaleStorage() {
 
    /* Объявляем переменные, по которым будем удалять старые записи из хранилища*/
    var key, value;
 
    var nowMoment = moment();
    var minusOneMinutes = nowMoment.subtract(1, 'm');
 
    var nowMomentMinusOneMinutes = minusOneMinutes.format('DD-MM-YYYY HH:mm:ss Z');
    outputMessage(".displayMomentOneMinutes", nowMomentMinusOneMinutes, "purple");
 
    var list = '';
      
    /* Перебираем данные в хранилище*/
    for (var i = 0; i < localStorage.length; i++) {
        /*получаем ключ записи*/
        key = localStorage.key(i);
        /*получаем по ключу значение*/
        value = localStorage.getItem(localStorage.key(i));
 
        /*Анализируем объект полученные из localeStorage и преобразуем его в json-формат*/
        var json = JSON.parse(value);
        /* получение значение из json-объекта по его ключу*/
        var dateView = json.dateView;
 
        var reg = moment(dateView);
 
        /* если с момента просмотра товара прошло более чем 60 секунд, то удаляем данную запись*/
       if (reg.isBefore(minusOneMinutes)) {
           //outputMessage(".regGoods", "товар зарегистрирован больше 1 минуты назад", "red");
 
           list = list + '<li>' + key + ' : ' + value + '</li>';
 
          localStorage.removeItem(key);
       } else {
           outputMessage(".regGoods", "товар зарегистрирован меньше минут назад ", "blue");
          
       }
 
    }
    outputMessage(".storageYes", '<ul>' + list + '</ul>', "blue");
 
}
Данный цикл работает но не так как нужно.

За 1-й проход удаляется элемент, но вместе с тем и уменьшается длина localeStorage и меняются индексы обектов в localeStorage, а значить не все объекты удаляются, цикл просто остановиться, так как условие выполнилось.

Как это можно исправить?

Поясните пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2019, 21:16
Ответы с готовыми решениями:

Как организовать цикл по определенному столбцу DBGrid?
Как организовать цикл по определенному столбцу с проверкой ?:read: В builder

Как отсортировать набор строк по определенному признаку?
Представим что есть несколько строк: 25р за проезд 10р комиссия по оплате 150р покупки 50р за пропуск Как сделать чтобы они...

Перебор файла посимвольно, как организовать цикл, работающий до конца файла.
Нужно перебрать файл посимвольно и, учитывая спецсимволы записать содержимое файла в Memo1. Помогите пожалуйста организовать цикл...

3
98 / 64 / 36
Регистрация: 04.12.2018
Сообщений: 158
09.01.2019, 23:47
Есть вероятность, что в localStorage будет что-то ещё кроме товаров. Логичнее всю корзину (массив товаров) хранить в одном значении. Новую корзину получать из старой через метод filter:

JavaScript
1
2
3
4
5
var cart = JSON.parse(localStorage.getItem('cart'));
cart = cart.filter(function (item) {
  . . .
});
localStorage.setItem('cart', JSON.stringify(cart));
0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
10.01.2019, 10:06  [ТС]
Вот решение по моему вопросу

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
* Удаляем старые записи*/
function controlSizeLocaleStorage() {
 
    /* Объявляем переменные, по которым будем удалять старые записи из хранилища*/
    var key, value;
 
    var nowMoment = moment();
    var minusOneMinutes = nowMoment.subtract(1, 'm');
 
    var nowMomentMinusOneMinutes = minusOneMinutes.format('DD-MM-YYYY HH:mm:ss Z');
    outputMessage(".displayMomentOneMinutes", nowMomentMinusOneMinutes, "purple");
 
    var list = '';
      
    /* Перебираем данные в хранилище*/
    var i = localStorage.length-1;
    do{
        /*получаем ключ записи*/
        key = localStorage.key(i);
        /*получаем по ключу значение*/
        value = localStorage.getItem(localStorage.key(i));
 
        /*Анализируем объект полученные из localeStorage и преобразуем его в json-формат*/
        var json = JSON.parse(value);
        /* получение значение из json-объекта по его ключу*/
        var dateView = json.dateView;
 
        var reg = moment(dateView);
 
        /* если с момента просмотра товара прошло более чем 60 секунд, то удаляем данную запись*/
        if (reg.isBefore(minusOneMinutes)) {
            //outputMessage(".regGoods", "товар зарегистрирован больше 1 минуты назад", "red");
 
            list = list + '<li>' + key + ' : ' + value + '</li>';
 
            localStorage.removeItem(key);
        } else {
            outputMessage(".regGoods", "товар зарегистрирован меньше минут назад ", "blue");   
        }
        i--;
    }while(i >= 0);
 
    outputMessage(".storageYes", '<ul>' + list + '</ul>', "blue");
 
}
решено


Цитата Сообщение от pvzh Посмотреть сообщение
Есть вероятность, что в localStorage будет что-то ещё кроме товаров. Логичнее всю корзину (массив товаров) хранить в одном значении. Новую корзину получать из старой через метод filter:
Можете пояснить ваш код ?

Сделайте пожалуйста его более полным, на основе моего примера (то метод который заполняет корзину).
0
98 / 64 / 36
Регистрация: 04.12.2018
Сообщений: 158
10.01.2019, 10:38
Тут дело не в коде. Не навязываю своё мнение. Не стал бы я каждый товар держать в отдельном ключе localStorage. Корзина это цельная сущность, хранить и обрабатывать её надо целиком. Задача сводится к фильтрации массива, для этого подходит встроенный метод Array.filter(). Тот случай, когда хорош функциональный подход вместо for.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2019, 10:38
Помогаю со студенческими работами здесь

Создание дерева по определенному признаку
Как можно составить дерево, имея следующие данные: Например, у меня есть названия компьютеров (y101-ws01, y102-ws01, y101-ws02,...

Поиск объекта в коллекции по определенному признаку
Существует коллекция(ArrayList), в которой содержатся объекты 2-ух разных классов, но наследованных от одного родителя. Каждый из этих...

Поиск по определенному признаку и склеивание строк
Здравствуйте уважаемые форумчане. Я очень рассчитываю на вашу помощь. Помогите решить задание, так как я не очень силен в VBA. ...

Сформировать массив и отсортировать его по определенному признаку
Требования • Оформить вычисления в виде консольного приложения. • При обработке массива структур использовать временную динамическую...

Можно ли организовать цикл для создания элементов окна и как?
Привет. Можно ли организовать цикл для создания элементов окна? Если можно, то как? я получаю информацию о необходимом количестве элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru