Javascript 如何用作为参考的路径替换嵌套的道具?

Javascript 如何用作为参考的路径替换嵌套的道具?,javascript,Javascript,如何用作为参考的路径替换嵌套的道具 下面是一个带有一些道具和一些主要道具的对象 const obj = { items: { props: { prop1: { $ref: "#/items/props/Prop1", }, prop2: { $ref: "#/items/props/Prop2", }, pr

如何用作为参考的路径替换嵌套的道具

下面是一个带有一些道具和一些主要道具的对象

const obj = {
    items: {
        props: {
            prop1: {
                $ref: "#/items/props/Prop1",
            },
          prop2: {
            $ref: "#/items/props/Prop2",
          },
          prop3: {
            $ref: "#/items/props/Prop3",
          },
          prop4: {
            subItems1: {
              $ref: "#/items/props/Prop4",
            },
            subItems2: {
              $ref: "#/items/props/Prop4",
            },
          },
          prop5: {
            $ref: "#/items/props/Prop5",
          },
          prop6: {
            $ref: "#/items/props/Prop6",
          },
          prop7: {
            $ref: "#/items/props/Prop7",
          },
          Prop1: {
              nestedpropsFromProp1: {nestedSubPropsFromProp1: {}}
          },
          Prop2: {
              nestedpropsFromProp2: {nestedSubPropsFromProp2: {}}
          },
          Prop3: {
              nestedpropsFromProp3: {nestedSubPropsFromProp3: {}}
          },
          Prop4: {
              nestedpropsFromProp4: {nestedSubPropsFromProp4: {}}
          },
          Prop5: {
              nestedpropsFromProp5: {nestedSubPropsFromProp5: {}}
          },
          Prop6: {
              nestedpropsFromProp6: {nestedSubPropsFromProp6: {}}
          },
          Prop7: {
              nestedpropsFromProp6: {nestedSubPropsFromProp7: {}}
          },

        }
    }
}
预期结果:

const exp_obj = {
    items: {
        props: {
            prop1: {nestedSubPropsFromProp1: {}},
          prop2: {nestedSubPropsFromProp2: {}},
          prop3: {nestedSubPropsFromProp3: {}},
          prop4: {
            subItems1: {nestedSubPropsFromProp4: {}},
            subItems2: {nestedSubPropsFromProp7: {}},
          },
          prop5: {nestedSubPropsFromProp5: {}},
          prop6: {nestedSubPropsFromProp6: {}},
          prop7: {nestedSubPropsFromProp7: {}},
        }
    }
}
这里的想法是取代

            prop1: {
                $ref: "#/items/props/Prop1",
            },
使用
$ref中的值:“#/items/props/Prop1”
(需要此值的地方..即如果在多个位置引用同一路径($ref),所有这些位置都将被替换)

因此我们得到
prop1:{nestedsubspsfromprop1:{}

原始pro(大写的pro,例如
Prop1
)将从最终结果中删除


唯一的要求是每当遇到$ref->读取它对应的值(即{$ref:value}。此值将是实际道具的路径。&只需将该实际道具附加到您看到$ref的位置。就是这样。!我提供了一个预期结果示例。请检查一下!@

首先,您可以替换所有值并保存路径 然后删除路径

下面是使用
lodash
函数
get

const replaceRefs = obj => {
   const refs = new Set()
   const readProps = (currentObj) => {
      if (typeof currentObj !== 'object') return 
      for (const key in currentObj) {
         if (key === '$ref') {
            const refPath = currentObj[key].substr(2).replace(/\//g, '.')
            currentObj[key] = _.get(obj, refPath) 
            refs.add(refPath)
         } else {
            readProps(currentObj[key])
         }
      } 
   }

   readProps(obj)
   refs.forEach(ref => {
      const parts = ref.split('.')
      const key = parts.pop()

      delete _.get(obj, parts.join('.'))[key]
   })

}

在对象上发生变异。使用Map()存储[$ref]:对对象的引用。
递归遍历对象以查找$ref,然后遍历路径。
假设所有路径的格式均为
#/path/path/…

注意:您没有指定如何处理无效的$ref。我现在只是将它们替换为未定义。添加了代码来处理该问题,因为示例中的路径并不都有效。
注意:相同的引用将引用相同的对象。更改其中一个引用将更改指向相同路径的所有引用。这是故意的。如果要防止此情况发生,请添加克隆

const map=new map()
walk=node=>{
if(typeof节点!=='object')返回
Object.keys(节点).forEach(k=>{
如果(!节点[k])返回
常量{$ref}=node[k]
如果($ref){
如果(!map.has($ref)){
const dir=$ref.substr(2).split('/'),
name=dir.pop()
设ptr=obj
如果(!(ptr=ptr[p])中断,则为(dir的常数p)
map.set($ref,ptr&&ptr[name])
如果(ptr)删除ptr[名称]
}
节点[k]=map.get($ref)
删除节点[k]。$ref
}
else walk(节点[k])
})
}
步行(obj)
console.log(obj)

常量对象={
项目:{
道具:{
建议1:{
$ref:“#/items/props/Prop1”,
},
提案2:{
$ref:“#/items/props/Prop2”,
},
提案3:{
$ref:“#/items/props/Prop3”,
},
建议4:{
分项1:{
$ref:“#/items/props/Prop4”,
},
分项2:{
$ref:“#/items/props/Prop4”,
},
},
建议5:{
$ref:“#/items/props/Prop5”,
},
建议6:{
$ref:“#/items/props/Prop6”,
},
提案7:{
$ref:“#/items/props/Prop7”,
},
建议1:{
nestedpropsFromProp1:{nestedSubPropsFromProp1:{}
},
提案2:{
nestedpropsFromProp2:{nestedSubPropsFromProp2:{}}
},
提案3:{
nestedpropsFromProp3:{nestedSubPropsFromProp3:{}}
},
建议4:{
nestedpropsFromProp4:{nestedSubPropsFromProp4:{}}
},
建议5:{
nestedpropsFromProp5:{nestedSubPropsFromProp5:{}}
},
建议6:{
nestedpropsFromProp6:{nestedSubPropsFromProp6:{}}
},
提案7:{
nestedpropsFromProp6:{nestedSubPropsFromProp7:{}
},
}
}
}

您是在使用json模式库还是从头开始?如果是从头开始,为什么?我有一个json模式。我只想从中提取所需的道具。json模式有很多不需要的东西,如描述、示例、类型等。我只想删除所有这些东西并只获取所需的项目。您能建议使用json模式吗第一种方法?所有路径都会这么简单吗?不,这实际上是一种简化形式。原始路径将嵌套。但有些类似。您不必担心这一点!@Reaggarav,请提供有效的示例,这一个无效的Prop2:{nestedpropsFromProp2:{nestedSubPropsFromProp2:{},右括号丢失。你能更新代码吗?(如果写得不正确,因为我现在已经纠正了错误)@Reaggarav,我的代码与你的错误无关,没有什么需要更新的。只是愚弄一下想法,如果它不完全是你所需要的,请更正一下。你也能回答这个问题吗?