Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Redux对象数组的normalizer架构_Reactjs_Redux_Normalization_Normalizr - Fatal编程技术网

Reactjs Redux对象数组的normalizer架构

Reactjs Redux对象数组的normalizer架构,reactjs,redux,normalization,normalizr,Reactjs,Redux,Normalization,Normalizr,我的api当前的响应如下: [ { "device_id": "1234", "network_status": "Offline", "status": "Yes", "frequency": 50, }, { "device_id": "12345", "network_status": "online", "status": "no", "frequency": 12

我的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,

   },
]
使用最新文档:

我知道这些文档已经更新了,所以看看堆栈上的其他问题,我还没有找到类似的例子。 “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)
我想得到以下输出。将设备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,

   },
  ]
}

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

normalizer希望您的实体具有id属性。如果包含id的字段有另一个名称,则必须显式定义它:

从“normalizer”导入{normalize,schema}; 常数数据=[ { 设备id:1234, 网络状态:脱机, 状态:是, 频率:50, }, { 设备id:12345, 网络状态:在线, 现状:没有, 频率:123, }, { 设备id:12346, 网络状态:在线, 现状:没有, 频率:423, }, ]; const device=new schema.Entity'devices',{},{idAttribute:'device_id'}; 常量normalizedData=normalizedData[设备]; console.lognormalized; 输出:

还可以与normalizer文档中的进行比较


我建议不要将id字段命名为device\u id,因为如果您正确命名了保存实体的变量,那么这通常是多余的。例如,如果您有一组设备,则应将其命名为设备。很明显,内部对象的id字段是设备id。无需在属性名称中重复该字段。

normalizer希望您的实体具有id属性。如果包含id的字段有另一个名称,则必须显式定义它:

从“normalizer”导入{normalize,schema}; 常数数据=[ { 设备id:1234, 网络状态:脱机, 状态:是, 频率:50, }, { 设备id:12345, 网络状态:在线, 现状:没有, 频率:123, }, { 设备id:12346, 网络状态:在线, 现状:没有, 频率:423, }, ]; const device=new schema.Entity'devices',{},{idAttribute:'device_id'}; 常量normalizedData=normalizedData[设备]; console.lognormalized; 输出:

还可以与normalizer文档中的进行比较


我建议不要将id字段命名为device\u id,因为如果您正确命名了保存实体的变量,那么这通常是多余的。例如,如果您有一组设备,则应将其命名为设备。很明显,内部对象的id字段是设备id。无需在属性名称中重复该字段。

这非常完美,谢谢@trixn。也谢谢你的建议。我还注意到,对于具有单个数组的对象,它的效果不太好。在normalize[data],[device]设备中围绕数据应用[]似乎可以正常工作。除非你知道其他的方法。谢谢为什么您指的是具有单个数组的对象?你能举一个非规范化数据结构的例子吗?当然可以@trixn。它只是const data=[{device_id:1233,status:online,…}],因此在这种情况下,api调用只返回一个设备。@如果api响应总是返回一个列表,那么它应该执行该列表,那么我的示例应该可以工作,无论该数组中是否有零个、一个或多个对象。仅当api仅返回单个对象时,才使用[]包装api响应。您必须确保api一致地返回列表。如果您想获取单个对象(例如,通过其id),那么它应该是另一个端点,其答案不必规范化。这一切都很完美,谢谢@trixn。也谢谢你的建议。我还注意到,对于具有单个数组的对象,它的效果不太好。在normalize[data],[device]设备中围绕数据应用[]似乎可以正常工作。除非你知道其他的方法。谢谢为什么您指的是具有单个数组的对象?你能举一个非规范化数据结构的例子吗?当然可以@trixn。它只是const data=[{device_id:1233,status:online,…}],因此在这种情况下,api调用只返回一个设备。@如果api响应总是返回一个列表,那么它应该执行该列表,那么我的示例应该可以工作,无论该数组中是否有零个、一个或多个对象。仅当api仅返回单个对象时,才使用[]包装api响应。您必须确保api一致地返回列表。如果您想获取单个对象(例如,通过其id),那么它应该是另一个端点,其答案不必规范化。完全
{
    "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"
    ]
}