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,我的代码与你的错误无关,没有什么需要更新的。只是愚弄一下想法,如果它不完全是你所需要的,请更正一下。你也能回答这个问题吗?