微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从深度嵌套的对象架构创建对象路径

如何解决从深度嵌套的对象架构创建对象路径

我有一个 avro 架构,它是一个深度嵌套的对象,具有相同的(子)结构。它看起来像这样:

{
  "type": "record","namespace": "company.car.v1","name": "CarV1","fields": [
    {
      "name": "plateNumber","type": "string"
    },{
      "name": "ownerId","type": "string","keepThisField": "true"
    },{
      "name" : "details","keepThisField": "true"
      "type" : {
            "type" : "record","name" : "DetailsV1","fields" : [
              {
                "name": "engine","type": {
                  "type": "record","name": "EngineV1","fields": [
                    {
                      "name": "size","type": "int","default": 0,"keepThisField": "true"
                    },{
                      "name": "valvesCount","default": 0
                    }
                  ]
                }
              },{
                "name" : "color","type" : "string","default" : "NONE"
              },{
                "name" : "rimsize","type" : "int","default" : "NONE"
              }
             ]},"default" : {}
   },{
      "name": "isBrandNew","type": "boolean"
    }
  ]
}

我希望能够在 JavaScript 中大致获取此对象(架构)的所有对象路径。因此,对于上面的示例,将返回类似于 extractPaths(avroSchema)内容

[
   "plateNumber","ownerId","details.engine.size","details.engine.valvesCount","details.color","details.rimsize","isBrandNew"
]

字符串的顺序显然无关紧要。任何人都知道如何在 JavaScript 中实现这一点?

解决方法

使用递归生成器函数生成路径字符串。

var schema = { "type": "record","namespace": "company.car.v1","name": "CarV1","fields": [{ "name": "plateNumber","type": "string" },{ "name": "ownerId","type": "string","keepThisField": "true" },{ "name": "details","keepThisField": "true","type": { "type": "record","name": "DetailsV1","fields": [{ "name": "engine","name": "EngineV1","fields": [{ "name": "size","type": "int","default": 0,{ "name": "valvesCount","default": 0 }] } },{ "name": "color","default": "NONE" },{ "name": "rimSize","default": "NONE" }] },"default": {} },{ "name": "isBrandNew","type": "boolean" }] }

function* extractPaths(schema,value) {
    for (const { name,type } of schema.fields) {
        let path = value ? `${value}.${name}` : name
        if (typeof type == "object")
            yield* extractPaths(type,path);
        else
            yield path
    }
}
console.log([...extractPaths(schema)]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。