首页 文章

Redux的对象数组的Normalizr模式

提问于
浏览
0

我的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的响应,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代码似乎缺少什么?

1 回答

  • 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);
    

    Output:

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

    Edit w0z95yy8zl

    还要与normalizr docs中的this example进行比较 .

    我建议不要将id字段命名为 device_id ,因为如果您正确命名保存实体的变量,这通常是多余的 . 如果你是有一个设备数组,你应该命名为 devices . 然后很明显,里面对象的 id 字段是设备ID . 无需在属性名称中重复此操作 .

相关问题