Redux 动态更新深嵌套减速器

Redux 动态更新深嵌套减速器,redux,react-redux,Redux,React Redux,这个问题可能被问了好几次,但我还没有找到解决办法 我有一个应用程序,可以每天保存一个条目,想象一下一本日记。处理条目的reducer的结构如下: const initial_state = {} { year: { month: { day: { entry: entryValue } } } } 每当我想在给定日期更新现有条目时,我都会执行以下操作: return {

这个问题可能被问了好几次,但我还没有找到解决办法

我有一个应用程序,可以每天保存一个条目,想象一下一本日记。处理条目的reducer的结构如下:

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],
这将抛出一个错误,说明无法从undefined读取1(例如在1月份)(因为没有年份,即它只是一个空对象,就像初始状态一样)

这使得我必须编写逻辑来处理要采取的操作。我必须先检查是否有条目,然后发送正确的操作。例如,如果它是有史以来的第一个条目,我将发送一个如下操作:

return {
      [payload.date.year]: { 
        [payload.date.month]: {
          [payload.date.day]: payload.data   
        }
      }
    };
我的问题是:有没有任何方法可以不用检查深层嵌套键值对的存在来编写约简?例如,检查给定年份中是否有条目

更具体地说,是否有任何方法使其不产生错误:

...state[payload.date.year][payload.date.month],

如果状态中不存在
有效负载.date.year

这是使用JavaScript短路的理想情况。我认为这就足够了:

...(state[payload.date.year] || {})[payload.date.month]

这有点难看,但我相信这是最简短的答案。这条线背后的想法是使用空对象作为后备,以防此类属性不存在。

非常感谢!我也在考虑这个问题,但在语法方面遇到了困难。