使用Normalizr进行双向链接

时间:2017-07-03 10:00:10

标签: javascript redux 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);

这确实标准化了我的对象,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中实现这个目的?什么是最好的方法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

这会将属性“regionGuid”添加到持有该地区guid的建筑物中。