0

我有一个从 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"
   ]
}

但是要获得建筑物的区域,我需要遍历每个区域并检查该建筑物是否包含在列表中。我不会通过标准化获得任何附加值。

如果我能够双向链接,那将是完美的。每个区域实体都有一个建筑指南列表,每个建筑都有一个区域指南。

有什么方法可以在 normalizr 中存档吗?最好的方法是什么?

谢谢您的帮助。

4

1 回答 1

0

我尝试了一些事情并找到了一个可行的解决方案。我不知道是否有更好的方法,但它是非常干净的代码并且它正在工作。

我只需要将建筑实体的定义更改为:

// Define buildings schema
const building = new schema.Entity(
  'building',
  {},
  {
    idAttribute: 'guid',
    processStrategy: (entity, parent) => ({ ...entity, regionGuid: parent.guid })
  }
);

这会将属性“regionGuid”添加到包含该区域的 guid 的建筑物中。

于 2017-07-03T10:16:31.867 回答