可能已经问过几次这个问题,但是我还没有找到解决方法。
我有一个应用程序,可以每天保存一个条目,想象一下日记。处理条目的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],
这将引发错误,表明无法从未定义中读取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
?
答案 0 :(得分:1)
这是使用 JavaScript短路的完美案例。我认为这足够了:
...(state[payload.date.year] || {})[payload.date.month]
有点丑陋,但我认为这是最短的答案。该行后面的想法是使用空对象作为后备,以防该属性不存在。