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

根据特定条件删除深度嵌套的 JavaScript 对象中的所有属性

如何解决根据特定条件删除深度嵌套的 JavaScript 对象中的所有属性

我有一个看起来像这样的对象(它是一个 Avro 架构):

{
  "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 举报,一经查实,本站将立刻删除。