【问题标题】:Normalizr schema for array of objects for ReduxRedux 对象数组的 Normalizr 模式
【发布时间】:2018-09-29 07:45:37
【问题描述】:

我的 api 的当前响应如下:

[
   {  
      "device_id": "1234",
      "network_status": "Offline",
      "status": "Yes",
      "frequency": 50,

   },
   {  
      "device_id": "12345",
      "network_status": "online",
      "status": "no",
      "frequency": 123,

   },
   {  
      "device_id": "12346",
      "network_status": "online",
      "status": "no",
      "frequency": 423,

   },
]

使用最新的文档: https://github.com/paularmstrong/normalizr/blob/master/docs/api.md#arraydefinition-schemaattribute

我了解这些文档已更新,因此查看堆栈上的其他问题我无法找到类似的示例。 “responseData”包含来自 api 的响应,它是一个对象数组。 [{},{},...]

我的代码是

import { schema } from 'normalizr';

const deviceid = new schema.Entity('device_id');
const arrayOfDevices = new schema.Array({
  device_id : deviceid,
})

normalize(responseData, arrayOfDevices)

我想得到以下输出。以 device_id 作为每个对象的键的实体对象。

  {
  entities: {
    device_id: { 
      '1234' : {
        .....
      },
      '12345' : {
        .....
      } ,
      '123456' : {
        .....
      }
    }
  },
  result: [
    ['1234','12345','123456'],
  ]
}

但是,我似乎只是得到了一个空实体的以下响应,而其他所有内容都被推入结果中

 {
  entities: {},
  result: [
   {  
      "device_id": "1234",
      "network_status": "Offline",
      "status": "Yes",
      "frequency": 50,

   },
   {  
      "device_id": "12345",
      "network_status": "online",
      "status": "no",
      "frequency": 123,

   },
   {  
      "device_id": "12346",
      "network_status": "online",
      "status": "no",
      "frequency": 423,

   },
  ]
}

我的 normalizr 代码似乎缺少什么?

【问题讨论】:

    标签: reactjs redux normalization normalizr


    【解决方案1】:

    Normalizr 期望您的实体具有 id 属性。如果包含 id 的字段有另一个名称,您必须明确定义它:

    import { normalize, schema } from 'normalizr';
    
    const data = [
      {
        "device_id": "1234",
        "network_status": "Offline",
        "status": "Yes",
        "frequency": 50,
    
      },
      {
        "device_id": "12345",
        "network_status": "online",
        "status": "no",
        "frequency": 123,
    
      },
      {
        "device_id": "12346",
        "network_status": "online",
        "status": "no",
        "frequency": 423,
    
      },
    ];
    
    const device = new schema.Entity('devices', {}, { idAttribute: 'device_id' });
    
    const normalizedData = normalize(data, [device]);
    
    console.log(normalized);
    

    输出:

    {
        "entities": {
            "devices": {
                "1234": {
                    "device_id": "1234",
                    "network_status": "Offline",
                    "status": "Yes",
                    "frequency": 50
                },
                "12345": {
                    "device_id": "12345",
                    "network_status": "online",
                    "status": "no",
                    "frequency": 123
                },
                "12346": {
                    "device_id": "12346",
                    "network_status": "online",
                    "status": "no",
                    "frequency": 423
                }
            }
        },
        "result": [
            "1234",
            "12345",
            "12346"
        ]
    }
    

    还可以与 normalizr 文档中的 this example 进行比较。

    我建议不要将 id 字段命名为 device_id,因为如果您正确命名包含实体的变量,那通常是多余的。如果你例如有一组设备,您应该将其命名为devices。那么很明显里面的objects的id字段就是设备id。无需在属性名称中重复。

    【讨论】:

    • 这是完美的感谢@trixn。也感谢您的建议。我还注意到它对于具有单个数组的对象效果不佳。在 normalize([data],[device]) 设备中围绕“数据”应用“ [ ] ”似乎工作正常。除非您知道任何替代方法。谢谢!
    • 为什么要使用“具有单个数组的对象”?你能举一个非规范化数据结构的例子吗?
    • 当然@trixn。它只是 const data =[{device_id : 1233, status: online, ... }] 所以在这种情况下只有一个设备从 api 调用返回。
    • @dankthreads 好吧,如果 api 响应总是返回一个列表(它应该这样做),那么无论该数组中是否有零个、一个或多个对象,我的示例都应该有效。仅当 api 仅返回单个对象时,使用 [] 包装 api 响应才有意义。您必须确保您的 api 始终返回一个列表。如果您想获取单个对象(例如通过其 id),它应该是另一个端点,其答案不必被规范化。完全没有
    猜你喜欢
    • 2021-08-11
    • 2017-06-21
    • 2018-05-27
    • 2020-11-29
    • 2017-01-23
    • 2018-11-26
    • 2019-04-28
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多