Помогите разобраться с решением задачи

Рейтинг: -1Ответов: 1Опубликовано: 16.02.2023

Условие задачи: В localStorage по ключу "counters" находится JSON c объектом, полями которого являются имена счётчиков, а значениями - числовое значение счётчика.

Напишите функцию incrementCounter, которой на вход первым параметром передаётся counterName - имя счётчика.

Задача функции - увеличить значение счётчика counterName на 1 и обновить данные в localStorage.

В localStorage может находится не валидный JSON, чтение которого может привести к ошибке, в этом случае функция должна записывать новые данные, где у указанного счетчика будет значение 1.

В конце функция должна возвращать значение счетчика после инкремента.

Пример использования:

// в localStorage 1 счетчик: bannerClick = 5
incrementCounter('bannerClick'); // 6
incrementCounter('bannerClose'); // 1
// в localStorage 2 счетчика: bannerClick = 6, bannerClose = 1

Вот само решение:

function incrementCounter(counterName){
     let counters;

    try {
        counters = JSON.parse(localStorage.getItem("counters"));
    } catch (er) {
        counters = {};
    }
    if(typeof counters[counterName] !== 'number'){
        counters[counterName] = 0;
    }
    counters[counterName]++;
    localStorage.setItem("counters", JSON.stringify(counters));

    return counters[counterName];
}

  1. Первое меня интересует блоки try/catch. В try мы в новоиспеченную переменную заносим значения ключа counters из localStorage, сразу же запарсивая. А что происходит в блоке catch? Почему там написано counters = {}?

  2. Почему в условии пишут counters[counterName]? Это обращение к значению счетчика, находящегося в localStorage? И почему, если тип counters[counterName] НЕ number, то ему присваивается значение 0? Это для случая, если будут записываться новые данные?

  3. В предпоследней строчке в localStorage заносится counters, а почему не counters[counterName]?

Ответы

▲ 1Принят
  1. Почему там написано counters = {}?
    Изначально counters не присваивается никакого значение, так что если происходит ошибка и получить данные из localStorage не получится, дальнейший код выдаст ошибку. Чтобы этого избежать counters присваивается пустой объект.

  2. Почему в условии пишут counters[counterName]
    Обычная скобочная нотация - обращение к полю объекта.

  3. Почему, если тип counters[counterName] НЕ number, то ему присваивается значение 0?
    По названию очевидно, что counter - счётчик, он должен быть числом, а если он им не является, то ему присваивается значение 0.

  4. В предпоследней строчке в localStorage заносится counters, а почему не counters[counterName]?
    А почему должно? counters[counterName] - одно значение из объекта, counters - все значения. Вам же надо сохранить все значения, а не только то которое вы изменили.