是否有一种有效的方法来遍历 avro 模式?
Is there an efficient way to iterate through an avro schema?
我希望能够遍历并访问 avro 模式的 'name' 字段值,但是由于特定的方式,我无法找到一种有效的方法,而不会获得额外的值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 对象转换为 key/value 对数组。
- 迭代对和:
一种。如果
value
是 null
什么也不做。
b.如果 value
是一个对象,则使用递归将此逻辑应用于它。
C。如果 key
是 name
将值推送到通过 Clojure
. 访问的名为 result
的数组
您的函数正在抓取键为 name
的任何 value
。这就是返回 foobar
和 Foo
的原因。
查看 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' ]
希望对您有所帮助。
我希望能够遍历并访问 avro 模式的 'name' 字段值,但是由于特定的方式,我无法找到一种有效的方法,而不会获得额外的值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 对象转换为 key/value 对数组。
- 迭代对和:
一种。如果
value
是null
什么也不做。 b.如果value
是一个对象,则使用递归将此逻辑应用于它。 C。如果key
是name
将值推送到通过Clojure
. 访问的名为
result
的数组
您的函数正在抓取键为 name
的任何 value
。这就是返回 foobar
和 Foo
的原因。
查看 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' ]
希望对您有所帮助。