两种方式 Link 使用 Normalizr

Two Way Link Using Normalizr

我有一个区域列表,它是从 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);

这确实规范化了我的对象,规范化数据是这样的:

{  
   "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"
   ]
}

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

如果我能够link双向就完美了。每个区域实体都有一个建筑指南列表,每个建筑都有一个区域指南。

有没有办法在 normalizr 中实现这个?什么是最好的方法?

感谢您的帮助。

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

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

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

这会将 属性 "regionGuid" 添加到保存该区域 guid 的建筑物。