@Mark321

Почему не работает код переключения наличия элемента в массиве?

На редаксе пишу редьюсер.
Пушу в массив айтем и хочу затем проверять, если он в массиве уже есть, то вернуть новый массив без него.
1. Пушу любой айтем
2. Проверяю пришедший экшен имеется в массиве? да
3. Присваиваю массиву значение в котором ищу элементы не равные экшену
В моей голове это работает, но возвращает пустой массив. Что не так или как это легче можно сделать?

state.items.push(action.payload)
if (state.items.includes(action.payload)) {
  state.items = state.items.filter((el, i) => el !== action.payload)
}
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
0xD34F
@0xD34F
Пушу в массив айтем и хочу затем проверять, если он в массиве уже есть, то...

Зачем проверять, если вы его только что добавили и, следовательно, он там точно есть? Удаляйте просто так - без проверки. А можно и вообще ничего не делать, с тем же результатом - добавили-удалили, никаких изменений.

Сначала проверяем наличие элемента, затем действуем в зависимости от результата проверки:

return {
  ...state,
  items: state.items.includes(action.payload)
    ? state.items.filter(n => n !== action.payload)
    : [ ...state.items, action.payload ],
};

Или, при использовании redux-toolkit, вместо проверки наличия элемента ищем его индекс:

const index = state.items.indexOf(action.payload);
if (index === -1) {
  state.items.push(action.payload);
} else {
  state.items.splice(index, 1);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы