Возможно, этот вопрос задавался пару раз, но я еще не нашел своего решения.
У меня есть приложение, которое сохраняет запись на каждый день, представьте дневник. Редуктор, который обрабатывает записи, имеет следующую структуру:
const initial_state = {}
{
year: {
month: {
day: {
entry: entryValue
}
}
}
}
Всякий раз, когда я хочу обновить существующую запись в данный день, я делаю:
return {
...state,
[payload.date.year]: {
...state[payload.date.year],
[payload.date.month]: {
...state[payload.date.year][payload.date.month],
[payload.date.day]: payload.data
}
}
};
Проблема в том, что если пользователь загружает запись в первый раз, я получаю сообщение об ошибке, потому что
...state[payload.date.year][payload.date.month],
это выдаст ошибку, говорящую о том, что не может прочитать 1 (как, например, в январе) из неопределенного (поскольку нет года, т. Е. Это просто пустой объект, как в initial_state).
Это заставляет меня писать логику, которая обрабатывает, какое действие предпринять. Я должен проверить, есть ли запись или нет, а затем отправить правильное действие. Так, например, если это будет первая запись, я отправлю действие, подобное этому:
return {
[payload.date.year]: {
[payload.date.month]: {
[payload.date.day]: payload.data
}
}
};
Мой вопрос таков: есть ли способ написать редукторы так, чтобы вам не приходилось проверять наличие глубоких вложенных пар ключ-значение? Например, проверить, есть ли запись в данном году?
Более конкретно, есть ли способ сделать так, чтобы это не приводило к ошибке:
...state[payload.date.year][payload.date.month],
если payload.date.year
не существует в штате?