#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];
}