Каков чистый способ использования литерала объекта для отслеживания нескольких (неизвестных) счетчиков?

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

const counts = {};

for (let i = 0; i < 100; i++) {
    const status = functionThatGivesSomeKnownOrUnknownStatus();

    counts[status] = counts[status] ? counts[status] + 1 : 1;
}

Часть, которая мне не нравится, это строка counts[status] = counts[status] ? counts[status] + 1 : 1;, есть ли способ сделать ее короче и проще/менее избыточной/чище? Это скрипт узла, поэтому решения ES6/7 приветствуются.

Одним из способов может быть инициализация литерала counts с ключами, уже установленными на 0, но я не знаю, какой статус может дать функция.


Постарался сделать заголовок максимально четким и лаконичным. Если его можно улучшить, не стесняйтесь его редактировать.


person Alvaro Castro    schedule 01.04.2019    source источник
comment
counts[status] = (counts[status] || 0) + 1 экономит одно повторение.   -  person Ry-♦    schedule 01.04.2019
comment
Возможным подходом для большей семантики является использование по умолчанию dict со значением 0:   -  person juvian    schedule 01.04.2019
comment
(Однако не реализуйте диктофон по умолчанию с прокси, как в верхнем ответе на этот вопрос. Гораздо чище сделать это поверх Map.)   -  person Ry-♦    schedule 01.04.2019


Ответы (1)


Как прокомментировал @Ry, в итоге я использовал это решение:

counts[status] = (counts[status] || 0) + 1;

Внутри кода:

const counts = {};

for (let i = 0; i < 100; i++) {
    const status = functionThatGivesSomeKnownOrUnknownStatus();

    counts[status] = (counts[status] || 0) + 1;
}
person Alvaro Castro    schedule 29.07.2019