【问题标题】:Two Way Link Using Normalizr使用 Normalizr 的双向链接
【发布时间】:2017-12-06 13:18:05
【问题描述】:

我有一个从 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 中存档吗?最好的方法是什么?

感谢您的帮助。

【问题讨论】:

    标签: javascript redux normalizr


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多