Normalizr - 如何处理已经规范化的嵌套实体

时间:2017-07-11 20:56:09

标签: reactjs redux react-redux normalizr

我的嵌套JSON中的实体已经遵循normalizr格式,其中idAttribute已经是定义对象的键:

groups: [{
  id: 'foo',
  families: {
    smiths: {
      people: [{
        id: 'sam',
      }, {
        id: 'jake',
      }],
    },
    jones: {
      people: [{
        id: 'john',
      }, {
        id: 'sue',
      }],
    },
  },
}];

在此示例中,请注意families属性正在使用ID(smithsjones)来标识具有ID的对象数组的people

这种模式可能如下所示:

const person = new Entity('person');
const family = new Entity('family', {
  people: [person],
}, {idAttribute: ???});
const group = new Entity('family', {
  family: [family],
});

问题:有没有办法指定架构的idAttribute是定义它的关键?换句话说,我如何定义Family的架构,因为它与groupspeople相关?

另一个问题是,有没有办法denormalize扁平状态,以便家庭families: {[id]: obj}模式保持与上面示例json中的相同?

1 个答案:

答案 0 :(得分:2)

  

有没有办法指定架构的idAttribute是定义它的键?

是。 idAttribute函数有3个参数:valueparentkey。请阅读docs。在您的情况下,您可以使用key以及schema.Values

const family = new schema.Entity('families', { 
    people: [ person ] 
}, (value, parent, key) => key);
const families = new schema.Values(family);
const group = new schema.Entity('groups', {
    families
});

对于denormalize,您需要family的单独架构,因为无法从密钥中派生ID。