【问题标题】:Is there an efficient way to iterate through an avro schema?有没有一种有效的方法来遍历 avro 模式?
【发布时间】:2019-11-23 16:27:10
【问题描述】:

我希望能够遍历并访问 avro 架构的“名称”字段值,但由于 avro 期望其架构的特定方式,我无法找到一种有效的方法来执行此操作而不会获得额外的值数据。

我可以递归地遍历它,就好像它是一个 js 对象一样;但是,我最终得到了一些我不想包含在结果中的字段。

例如,在下面的代码中,我想要返回的唯一值是“foobar”,但是我也得到了我不想要的“Foo”,因为它是对象数组的名称,而不是单个值。

{
          "type": "record",
          "name": "Foo",
          "fields": [
            {
              "name": "foobar",
              "type": "string"
            }
          ]
}

我正在使用的当前函数如下所示:

  iterateAvro = (target) => {
    let result = [];
    Object.entries(target).forEach(([key, val]) => {
        if (val === null){
          return null
        }
        if (typeof val === 'object'){
          result = result.concat(this.iterateAvro(val));
        } else {
          if(key === 'name'){
            result.push(val) 
          }
        }
    })
    return result
  }

我是 avro 的新手(以及一般的编码),不知道是否有 avro 特定的方式来执行此操作。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript reactjs schema avro


    【解决方案1】:

    您在函数中所做的是:

    1. 将 JavaScript 对象转换为键/值对数组。
    2. 遍历这些对并且: 一种。如果valuenull,则什么也不做。 湾。如果value 是一个对象,则使用递归将此逻辑应用于它。 C。如果keyname,则将值推送到一个名为result 的数组,该数组通过Clojure 访问。

    您的函数正在获取任何value,其键为name。这就是返回 foobarFoo 的原因。

    查看Apache Avro's documentation,我看到fields 键内有一个包含多个field 对象的列表,每个对象都必须有一个name 键。

    因此,假设您想获取所有 field names 的值,您可以执行以下操作:

    // JSON object gotten directly from Apache Avro's documentation.
    var avroRecord = {
      "type": "record",
      "name": "LongList",
      "aliases": ["LinkedLongs"],                      // old name for this
      "fields" : [
        {"name": "value", "type": "long"},             // each element has a long
        {"name": "next", "type": ["null", "LongList"]} // optional next element
      ]
    }
    
    function getFieldsNames(record) {
      return avroRecord.fields.map((field) => {
        return field.name;
      });
    }
    
    console.log(getFieldsNames(avroRecord))
    // [ 'value', 'next' ]
    

    我希望这会有所帮助。

    【讨论】:

    • 谢谢! @guzmonne 这很有帮助:)
    • @Jess222,不客气。如果对您有帮助,请将问题标记为已回答。
    • 如果我可以@guzmonne 我会的,但它不会让我,因为我有“少于 15 名声望”。
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2018-12-12
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    相关资源
    最近更新 更多