Упрощение переключения элементов массива в чистом javascript

#javascript #arrays

#javascript #массивы

Вопрос:

можно ли еще больше упростить следующий код или это самый чистый из возможных способов? То, что я пытаюсь сделать, это, если действие.полезная нагрузка не включена в массив ролей, вставьте ее в него, если она есть, удалите ее. Я не хочу использовать Lodash для этого.

 const idx = state.rolesFilter.findIndex(
  role => role === action.payload,
);
if (idx === -1) {
  nextState.roles.push(action.payload);
} else {
  nextState.roles = state.roles.filter(role => role !== action.payload);
}
  

Комментарии:

1. Почему вы изменяете свой массив при добавлении, но избегаете мутации при удалении?

2. Итак, у вас есть state.rolesFilter , state.roles , nextState.roles … Как связаны все эти массивы? Описание, похоже, относится к другой ситуации (тот же массив), что и ваш код.

Ответ №1:

Вы могли бы использовать Set

 const set = new Set(state.roles);
const action = set.has(action.payload) ? 'delete' : 'add';
set[action](action.payload);
nextState.roles = [...set]; 
  

Если вы планируете часто использовать «переключение», вы можете создать функцию

 function toggle(array, item) {
    const set = new Set(array);
    const action = set.has(item) ? 'delete' : 'add';
    set[action](item);
    return [...set];
}