2017-03-01 30 views
0

我的目标是这个对象正常化嵌套实体:规范化共享当前架构

{ 
    talks: [ 
    { 
     id: 1755, 
     speakers: [ 
     { 
      id: 1487, 
      name: 'John Doe', 
     }, 
     ], 
     related_talks: [{ 
     id: 14, 
     speakers: [{ 
      id: 125, 
      name: 'Jane Doe', 
     }], 
     event: { 
      id: 181, 
      name: 'First Annual', 
     }, 
     }], 
     event: { 
     id: 180, 
     name: 'July Party', 
     }, 
    }, 
    ], 
}; 

到这样的结果:

{ 
    entities: { 
    events: { 
     181: { 
     id: 181, 
     name: 'First Annual' 
     }, 
     180: { 
     id: 180, 
     name: 'July Party' 
     } 
    }, 
    speakers: { 
     125: { 
     id: 125, 
     name: 'Jane Doe' 
     }, 
     1487: { 
     id: 1487, 
     name: 'John Doe' 
     } 
    }, 
    talks: { 
     1755: { 
     id: 1755, 
     event: 181, 
     speakers: [ 1487 ], 
     related_talks: [ 14 ], 
     }, 
     14: { 
     id: 14, 
     speakers: [ 125 ], 
     event: 180, 
     } 
    }, 
    }, 
    result: { 
    talks: [ 1755, 14 ], 
    }, 
} 

如果你会发现,在related_talks项目被处理与talk相同。

我的模式下面的例子中,并设置如下:

const speaker = new schema.Entity('speakers'); 
const event = new schema.Entity('events'); 

export const talk = new schema.Entity('talks', { 
    speakers: [speaker], 
    event, 
}); 

talk.define({ related_talks: [talk] }); 

无论我怎么努力,我不能得到的物品在related_talks添加到result.talks阵列。但是,它在entities对象中。

为了适应这种情况,我的模式配置丢失了什么?

回答

1

不幸的是,如果这是您的要求,Normalizr不适合您。或者,如果您正在通过ID查找“会谈”列表,则可以使用Object.keys(data.entities.talks)

+0

感谢您的超级快速回答 - 您能解释一下为什么我可能会_不想这样做吗?这不是一个很难的要求,但这是我期望正常工作的方式。 – vinspee

+0

它以这种方式工作,因为这是输入的实际结果。你用一个实体来给一个数组进行标准化,所以结果是标准化的形式。 –

+0

所以解决方案是将相关的谈话转移到谈判阵列(在API方面),并且在'talk'对象内部,将相关谈话阵列改为仅仅是每个谈话的ID?那样''会谈'阵列真的包含所有谈话? – vinspee