如何使用 normalizr 解析 FractalTransformer

Posted

技术标签:

【中文标题】如何使用 normalizr 解析 FractalTransformer【英文标题】:How to parse FractalTransformer with normalizr 【发布时间】:2020-11-27 22:34:10 【问题描述】:

我正在尝试在来自 FractalTransformer 且其嵌套子级具有“数据”属性的 JSON 上使用 paularmstrong/normalizr。 JSON 示例:


  "data": 
    "object": "Offer",
    "id": "5g6aqocew4qjzl40",
    "real_id": 26,
    "name": "Random Name",
    "created_at": 
      "date": "2019-06-18 11:13:08.000000",
      "timezone_type": 3,
      "timezone": "UTC"
    ,
    "readable_created_at": "1 year ago",
    "site": 
      "data": 
        "object": "Site",
        "id": "65zody8vj29vlegd",
        "name": "Test Site",
        "real_id": 1
      
    ,
    "countries": 
      "data": [
        
          "object": "Country",
          "code": "US",
          "name": "United States"
        ,
        
          "object": "Country",
          "code": "DE",
          "name": "Germany"
        
      ]
    
  ,
  "meta": 
    "include": [
      "site",
      "countries"
    ],
    "custom": []
  

我使用的架构:

export const offerSchema = new schema.Entity('offers')
export const siteSchema = new schema.Entity('sites', , 
  processStrategy: (value) => 
      return  ...value.data 
  ,
  idAttribute: (value) => 
      return value.data.id
  ,
)
export const countrySchema = new schema.Entity('countries')

offerSchema.define(
  site: siteSchema,
  countries: [countrySchema],
)

现在的问题是我从站点中删除了“数据”,因为它只是一个成功的对象,但在国家/地区的情况下我不能这样做。无论我尝试使用自定义 processStrategy 都失败了,因为国家是具有数组数据的对象(我认为这是问题所在,从实体到数组)。而在 idAttribute 函数中,我总是得到完整的数组,因此无法确定单个条目的 ID。所以最终的结果是国家的 ID 是未定义的。有什么好办法吗?

【问题讨论】:

【参考方案1】:

我实际上是用另一种方法来管理的。我在父级上添加了 processStrategy,在这种情况下为“Offer”,因此所有“数据”部分在到达其他子架构之前都会被剥离。

const normalizrStripDataOptions = 
  processStrategy: (value) => 
    const ret =  ...value 

    Object.keys(ret).forEach((key) => 
      if (ret[key] !== null) 
        if (ret[key].data && Array.isArray(ret[key].data)) 
          ret[key] = [...ret[key].data]
        

        if (ret[key].data && typeof ret[key].data === 'object') 
          ret[key] =  ...ret[key].data 
        
      
    )

    return ret
  ,


export const offerSchema = new schema.Entity('offers', , normalizrStripDataOptions)
export const siteSchema = new schema.Entity('sites')
export const countrySchema = new schema.Entity('countries')

offerSchema.define(
  site: siteSchema,
  countries: [countrySchema],
)

【讨论】:

以上是关于如何使用 normalizr 解析 FractalTransformer的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 normalizr 规范化来自 JSON 的数据?

如何使用“normalizr”规范化这个简单的 API 响应?

如何添加/删除使用 normalizr 生成的 redux 存储?

如何在 Jbuilder 和 Normalizr 之间展平数据

在 normalizr 中重命名结果属性

如何从字段表返回数据 api(fractal) 已设置默认值?