我有一个区域列表,它是从API获取的。在这个列表中,有多个建筑物。在JS中如下所示:
const regions = [
{
guid: 'REGION1-GUID',
name: 'Region 1',
buildings: [
{
guid: 'REGION1-BUILDING1-GUID',
name: 'Region 1 Building 1'
},
{
guid: 'REGION1-BUILDING2-GUID',
name: 'Region 1 Building 2'
}
]
},
{
guid: 'REGION2-GUID',
name: 'Region 2',
buildings: [
{
guid: 'REGION2-BUILDING1-GUID',
name: 'Region 2 Building 1'
},
{
guid: 'REGION2-BUIDLING2-GUID',
name: 'Region 2 Building 2'
}
]
}
];现在,我想使用normalizr来规范化这个JS对象。我稍后要做的是从一座建筑中获取区域。
所以我试着做以下几件事:
// Define the buildings schema
const building = new schema.Entity('building', {}, { idAttribute: 'guid' });
// Define the regions schema
const region = new schema.Entity(
'regions',
{
buildings: [building]
},
{ idAttribute: 'guid' }
);
const regionList = [region];
const normalizeData = () => {
const normalizedData = normalize(data, regionList);这确实标准化了我的对象,normalizedData是这样的:
{
"entities":{
"building":{
"REGION1-BUILDING1-GUID":{
"guid":"REGION1-BUILDING1-GUID",
"name":"Region 1 Building 1"
},
"REGION1-BUILDING2-GUID":{
"guid":"REGION1-BUILDING2-GUID",
"name":"Region 1 Building 2"
},
"REGION2-BUILDING1-GUID":{
"guid":"REGION2-BUILDING1-GUID",
"name":"Region 2 Building 1"
},
"REGION2-BUIDLING2-GUID":{
"guid":"REGION2-BUIDLING2-GUID",
"name":"Region 2 Building 2"
}
},
"regions":{
"REGION1-GUID":{
"guid":"REGION1-GUID",
"name":"Region 1",
"buildings":[
"REGION1-BUILDING1-GUID",
"REGION1-BUILDING2-GUID"
]
},
"REGION2-GUID":{
"guid":"REGION2-GUID",
"name":"Region 2",
"buildings":[
"REGION2-BUILDING1-GUID",
"REGION2-BUIDLING2-GUID"
]
}
}
},
"result":[
"REGION1-GUID",
"REGION2-GUID"
]
}但是要获得建筑物的区域,我需要遍历每个区域,并检查该建筑物是否包含在列表中。我不会通过标准化获得任何附加值。
这将是完美的,如果我能够在两个方向链接。每个区域实体都有一个建筑guid列表,每个建筑都有一个区域guid。
有没有办法在normalizr中实现这一点?最好的方法是什么?
谢谢你的帮助。
发布于 2017-07-03 18:16:32
我尝试了一些方法,找到了一个可行的解决方案。我不知道是否有更好的方法,但它是非常干净的代码,它是工作的。
我只需将建筑实体的定义更改为:
// Define buildings schema
const building = new schema.Entity(
'building',
{},
{
idAttribute: 'guid',
processStrategy: (entity, parent) => ({ ...entity, regionGuid: parent.guid })
}
);这会将属性"regionGuid“添加到包含该区域的guid的建筑物中。
https://stackoverflow.com/questions/44882721
复制相似问题