【问题标题】:How could one define the exact data types at any level of a nested object / array data-structure?如何在嵌套对象/数组数据结构的任何级别定义确切的数据类型?
【发布时间】:2021-05-25 19:51:31
【问题描述】:

我正在尝试定义一个“复杂”对象:

var tM = JSON.parse('{"version":"","series":[{"name":"","possModes":[],"instance":[{"date":"","mode":""}]}]}');

数组“instance”的所有项应该是类型的对象

{"date":"","mode":""}

所有数组“系列”的项目应该是类型的对象

{"name":"","possModes":[],"instance":[{"date":"","mode":""}]}

问题是只有索引 [0] 的项目获得了正确的属性,而更高索引的项目是“未定义的”,所以我无法将它们设置为所需的值。

我也尝试过明确定义tM,例如:

var Cinstance = new Object();
Cinstance.date = "";
Cinstance.mode = "";

var Cseries = new Object();
Cseries.name = '';
Cseries.possModes = [];
Cseries.instance = [new Object(Cinstance)];

var tM= new Object();
tM.version = "";
tM.series = [new Object(Cseries)];

也喜欢:

var tM = {series:
           [{instance:
              [{date:"",mode:""}
              ]
            }
           ]
         }

(这是针对我的具体问题而简化的版本)。

当然,它们最终都会得到相同的结果 - 仅定义了索引 [0] 的项。

【问题讨论】:

  • JavaScript 没有这样的类型概念。如果你想要这种编译时检查,你可以使用 TypeScript 和 Flow 等语言。
  • 谢谢 H.M.为了迅速的反应。只是为了让自己清楚 - 我可以不用“这种编译时检查”。我需要的是一种定义对象数组的方法。当你说“这种类型的编译时检查”时 - 你的意思是“在 javascript 中没有办法定义对象数组”?
  • 首先JSON.stringify(tM.series[0]) 准确地返回您所要求的... '{"name":"","possModes":[],"instance":[{"date":"","mode":""}]}';其次,new Object(Cinstance)new Object(Cseries) 都不会创建新实例,而是分别返回 CinstanceCseries 的原始引用。请花一些时间用简短的句子准确地写给自己你的传入数据是什么或代表什么以及你想要创建哪种数据结构? / 验证 ?在前者之上。
  • 你好彼得。感谢您的帮助。我想定义一个特定类型的对象数组。在这种特定情况下,一个对象数组 {date: "", mode: ""} 和另一个数组,其中所有项目都是“系列”类型的对象,因为我试图定义它们。
  • 如果 javascript 不提供定义对象数组的语法,是否有一种解决方法可以在分配值时或分配值之前“强制”它?如果是这样,你能指导我举个例子吗?

标签: javascript arrays json object types


【解决方案1】:

OP提供的数据结构...

{
  "version": "",
  "series": [{

    "name": "",
    "possModes": [],
    "instance": [{

      "date": "",
      "mode": ""
    }]
  }]
}

...does validate 反对以下JSON schema ...

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "My-Special-Schema-Or-Data-Structure-Title",
  "description": "Whatever I have to say about my described structure",
  "type": "object",
  "properties": {
    "version": {
      "description": " ... ",
      "type": "string"
    },
    "series": {
      "description": " ... ",
      "type": "array",
      "minItems": 1,
      "items": {
        "description": " ... ",
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "possModes": {
            "description": " ... ",
            "type": "array"
          },
          "instance": {
            "description": " ... ",
            "type": "array",
            "minItems": 1,
            "items": {
              "description": " ... ",
              "type": "object",
              "properties": {
                "date": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                }
              },
              "required": [
                "date",
                "mode"
              ]
            }
          }
        },
        "required": [
          "name",
          "possModes",
          "instance"
        ]
      }
    }
  },
  "required": [
    "version",
    "series"
  ]
}

甚至可以从JSON Schema Generator 开始。通过 OP 最初提供的数据结构,得到一个 JSON Schema 的坚实基础,然后可以继续剪裁。

【讨论】:

  • 嗨,彼得。按照您在答案中留下的链接,我深入研究了该主题并学到了很多东西。您定义的架构 '"title": "My-Special-Schema-Or-Data-Structure-Title"' 确实代表了我需要的结构。我在搜索中缺少并且找不到的是如何将此模式定义转换为可以在代码中使用的 javascript 对象。例如赋值,如:tM.series[0].instances[1].mode = "Mode 1";
  • @Oded ...您想要实现的目标只有在有一些要求要遵循或有既定的假设方式时才有可能。只是从这个方案没有人,因此也没有程序可以猜测哪些子结构是需要一次又一次创建的子结构。此类信息必须作为附加信息发送,例如一种自定义配置对象。另一个问题是,一个/谁将触发/调用对象创建的过程或人如何“知道”正确的参数类型。
  • @Oded ... 说了上面的话,也许您可​​以提供一个更大的图景,了解您实际尝试构建/实现的目标。
  • 我来自可以定义由数组和子结构(C++、C、PL/1)构建的“结构”的学科。通常,这些语言中的数组是固定长度的。当我开始用 JavaScript 编写代码时,我很高兴看到所有数组的长度都不同(我猜 JavaScript 将它们作为索引列表进行管理)。好吧,正如你上面提到的,这是不可能的,必须将这类结构作为“简单”对象进行管理,程序员必须在其中构建嵌套对象作为过程的一部分。
  • "... 将触发/调用对象创建的进程或人如何“知道”正确的参数类型” - 这是程序员的责任。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 2021-12-23
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 2017-11-01
  • 2018-03-10
相关资源
最近更新 更多