这就是为什么建议您保持数据存储(尤其是 Redux 存储)平坦的确切原因。通常,嵌套的数量应该最少,并且实体应该通过它们的 id 相互引用。
最好用一个例子来解释。目前,您的数据可能如下所示:
{
allUsers: [
{
id: 1,
name: 'Foo',
friends: [
{
id: 2,
name: 'Bar',
},
{
id: 3,
name: 'Baz'
}
]
},
{
id: 2,
name: 'Bar',
friends: [
{
id: 3,
name: 'Baz'
}
]
},
{
id: 3,
name: 'Baz',
friends: []
}
]
}
如您所见,有很多嵌套和重复。如果任何用户更改了他们的名字,那么在整个商店中传播这种更改将很困难,尤其是在更复杂的情况下。但是,如果我们将这个结构扁平化,它会变得更好:
{
users: {
1: {
id: 1,
name: 'Foo',
friends: [2, 3]
},
2: {
id: 2,
name: 'Bar',
friends: [3]
},
3: {
id: 3,
name: 'Baz',
frineds: []
}
},
allUsers: [1, 2, 3]
}
每个实体都存储在一个特定的位置。其他实体不能包含它的数据,只能通过id引用,所以不需要同步变化。这种方法可以避免很多数据完整性问题(包括您的问题),并最大限度地减少应用程序的内存占用。
对于查询这样的存储,您可以编写函数,将这些数据转换为更便于阅读的形状,并假设它们的结果是只读的。在 Redux 中,此类函数通常称为 selectors。