Собираем селектор на основе состояний чекбоксов (выставлен - класс должен присутствовать, не выставлен - помещаем класс внутрь
:not
), проверяем фильтруемые элементы на соответствие селектору:
document.querySelector('.options').addEventListener('change', e => {
const [ not, has ] = Array.prototype.reduce.call(
e.currentTarget.querySelectorAll('input'),
(acc, n) => (acc[+n.checked].push(`.${n.value}`), acc),
[ [], [] ]
);
const selector = `${has.join('')}:not(${not.join(',')})`;
for (const n of document.querySelector('.box').children) {
n.classList.toggle('hidden', !n.matches(selector));
}
});
Или, при обработке элемента перебираем чекбоксы и проверяем, что их состояния соответствуют наличию классов:
const checkboxes = [...document.querySelectorAll('.options input')];
const items = [...document.querySelector('.box').children];
checkboxes.forEach(n => n.addEventListener('change', onChange));
function onChange() {
items.forEach(({ classList: cl }) => {
cl.toggle('hidden', checkboxes.some(n => n.checked !== cl.contains(n.value)));
});
}