Проблема findIndex с Immer и Redux Starter Kit

У меня есть состояние редукции, которое мне нужно обновить, оно выглядит так:

[
    {
        date: moment("2019-06-15").toObject(),
        attendance: [
            {
                name: "Ruben Hensen",
                membershipNumber: "2084700",
                attending: true,
                present: false
            },
            {
                name: "Peter Petersen",
                membershipNumber: "2084701",
                attending: true,
                present: false
            },
            {
                name: "Karel Kootjes",
                membershipNumber: "2084702",
                attending: true,
                present: false
            },
            {
                name: "Niedaar Mennekes",
                membershipNumber: "2084703",
                attending: true,
                present: false
            },
        ]

    },
...
...
...
]

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

TOGGLE_PRESENCE: (state, action) => {
        console.info(state);
        console.info(action);
        const index = state.findIndex(week => week.date === action.payload.date);
        console.info(index);

    }

Проблема в том, что я использую Redux Starter Kit, а он использует Immer внутри редукторов. Если я запускаю свой редуктор, это результат журналов консоли.

Проблема findIndex с Immer и Redux Starter Kit

Не удается найти правильную неделю. Любые советы или указатели будут оценены. Я не совсем понимаю Immer или прокси-объекты, которые он использует.

Редактировать: @markerikson решил проблему. Я изменил это:

const index = state.findIndex(week => week.date === action.payload.date);

к этому:

const index = state.findIndex(week =>moment(week.date).isSame(action.payload.date));

И теперь он находит правильный индекс. Проблема findIndex с Immer и Redux Starter Kit

вы пытаетесь сравнить даты? toObject будет объектом, а не датой, которую можно сравнить, верно? так как вы обращаетесь к action.payload.date, который является объектом, потому что именно так называется ключ для moment.toObject. Так не будет ли action.payload.date.date?

John Ruddell 28.06.2019 19:25

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

Ruben Hensen 28.06.2019 22:47

== сравнение объекта не сравнивает ключи объектов. Он сравнивает расположение объектов в памяти. ака {'a': 'b'} == {'a': 'b'} неверно.

John Ruddell 28.06.2019 23:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
608
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Экземпляры moment не будут === равными друг другу. Вероятно, вам нужно использовать API-интерфейсы Moment для их сравнения, например:

const index = state.findIndex(week => week.date.isSame(action.payload.date));

Обратите внимание, что эта часть не имеет ничего общего конкретно с Immer или Redux Starter Kit — разные экземпляры объектов будут иметь разные ссылки.

Другие вопросы по теме