如何解决根据特定条件删除深度嵌套的 JavaScript 对象中的所有属性
{
"type": "record","namespace": "company.car.v1","name": "CarV1","fields": [
{
"name": "plateNumber","type": "string"
},{
"name": "ownerId",{
"name" : "details","type" : {
"type" : "record","name" : "DetailsV1","fields" : [
{
"name": "engine","type": {
"type": "record","name": "EngineV1","fields": [
{
"name": "size","type": "int","default": 0
},{
"name": "valvesCount","default": 0
}
]
}
},{
"name" : "color","type" : "string","default" : "NONE"
},{
"name" : "rimsize","type" : "int","default" : "NONE"
}
]},"default" : {}
},{
"name": "isBrandNew","type": "boolean"
}
]
}
我的主要目标是拥有一个函数,该函数将这样的对象作为输入并仅提取某些特定字段并生成此模式的子集。
一个看起来像这样的函数 reduceSchema(avroSchema,[paths])
例如:
function reduceSchema(avroSchemaOnTop,['ownerId','details.engine.size']
然后这会产生desired output
:
{
"type":"record","namespace":"company.car.v1","name":"CarV1","fields":[
{
"name":"ownerId","type":"string"
},{
"name":"details","type":{
"type":"record","name":"DetailsV1","fields":[
{
"name":"engine","type":{
"type":"record","name":"EngineV1","fields":[
{
"name":"size","type":"int","default":0
}
]
}
}
]
},"default":{}
}
]
}
目前我能够将属性 keepThisField
附加到我想要保留的每个字段(及其父树),在这种情况下是 details.engine.size 和 ownerId
{
"type": "record","type": "string","keepThisField": "true"
},"keepThisField": "true"
"type" : {
"type" : "record","default": 0,"keepThisField": "true"
},"type": "boolean"
}
]
}
我现在需要的是一种机制,能够删除所有其他没有属性 keepThisField
的字段(以深度嵌套的方式),然后在 keepThisField
属性之后本身。所以我们只剩下 desired output
。
有人知道如何在 JavaScript 中以通用方式实现删除过程吗?
更新:
这是我用 flatMap 尝试过的:
function fn(o) {
const hasMore = _.get(o,'type.fields');
if (o.keepThisField === true) {
if (hasMore) {
const retobj = {
...o,type: {
...o.type,fields: _.flatMap(o.type.fields,fn),}
};
_.unset(retobj,'keepThisField');
return retobj;
}
const cpO = o;
_.unset(cpO,'keepThisField');
return ({
...cpO,});
}
return [];
}
parentSchema.fields = _.flatMap(parentSchema.fields,fn)
解决方法
[回答我自己的问题]
流程中删除部分的潜在解决方案。感谢@Kinglish 引用 this Stack Overflow question 以使用 flatMap。
function fn(o) {
const hasMore = _.get(o,'type.fields');
if (o.keepThisField === true) {
if (hasMore) {
const retObj = {
...o,type: {
...o.type,fields: _.flatMap(o.type.fields,fn),}
};
_.unset(retObj,'keepThisField');
return retObj;
}
const cpO = o;
_.unset(cpO,'keepThisField');
return ({
...cpO,});
}
return [];
}
parentSchema.fields = _.flatMap(parentSchema.fields,fn)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。