如何将键路径数组返回到嵌套javascript对象中的值?
我正在尝试变换一个对象,该对象可能具有不同的嵌套级别:如何将键路径数组返回到嵌套javascript对象中的值?,javascript,arrays,object,recursion,nested,Javascript,Arrays,Object,Recursion,Nested,我正在尝试变换一个对象,该对象可能具有不同的嵌套级别: const obj = { some: { thing: { good: 'yo' }, one: 'else' }, something: { bad: 'oy' }, somethingtasty: 'mmm' } 进入包含值的原始路径和值的对象数组: const arr = [{ path:
const obj = {
some: {
thing: {
good: 'yo'
},
one: 'else'
},
something: {
bad: 'oy'
},
somethingtasty: 'mmm'
}
进入包含值的原始路径和值的对象数组:
const arr = [{
path: 'some.thing.good',
value: 'yo'
}, {
path: 'some.one',
value: 'else
}, {
path: 'something.bad',
value: 'oy'
}, {
path: 'somethingtasty',
value: 'mmm'
}]
对于处理不同嵌套度对象的类似问题,我发现了一个有用的答案:
但这并不能解决问题
- a:如何处理可变嵌套深度
- b:如何处理可变键
javascript中有没有一种方法可以递归遍历对象并将其键和值保存在数组中?一种可能的方法是递归遍历
对象。条目
:
const obj={
一些:{
事情:{
好:“哟”
},
一:“其他人”
},
一些东西:{
坏:“oy”
},
好吃的东西:“嗯”
};
const getNested=(对象、过程)=>{
常量[prop,value]=对象项(obj)[0];
推进(支撑);
如果(值的类型==='object'){
返回getNested(值,propArr);
}
返回{path:propArr.join('.'),value};
};
const arr=对象条目(obj)
.map([top,value])=>
typeof value=='object'?getNested(obj,[top]):({path:top,value})
);
控制台日志(arr)
您可以使用reduce
方法来创建递归函数
const obj={“some”:{“thing”:{“good”:“yo”},“one”:“else”},“something”:{“bad”:“oy”},“something tasty”:“mmm”}
功能路径(obj,prev=”“){
返回Object.keys(obj).reduce((r,e)=>{
常量路径=上一个+(上一个?'.+e:e);
常量值=对象[e];
如果(值的类型=='object'){
r、 推送(…路径(值,路径))
}否则{
r、 推送({path,value})
}
返回r
}, [])
}
常量结果=路径(obj)
log(result)
您可以采用迭代和递归的方法
函数getPaths(对象,临时=“”){
返回对象
.条目(对象)
.减少(
(r,[键,值]=>
(path=>r.concat(value&&typeof value==='object'
?获取路径(值、路径)
:{path,value})
(temp+(temp&&“)+键),
[]
);
}
const obj={some:{thing:{good'yo'},one'else'},something:{bad'oy'},something tasty'mmm'};
console.log(getpaths(obj))代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
const obj={
一些:{
事情:{
好:“哟”
},
一:“其他人”
},
一些东西:{
坏:“oy”
},
好吃的东西:“嗯”
}
const deepLinkFinder=(obj)=>{
设arr=[]
常量getKeyPath=(对象,路径)=>{
for(对象的常量键。键(obj)){
如果(对象的类型[键]=“对象”)
getKeyPath(obj[key],路径?
`${path}.${key}`:
`${key}`)
其他的
arr.push({
路径:路径?
`${path}.${key}`:
`${key}`,
值:obj[键]
})
}
}
getKeyPath(obj)
返回arr
}
console.log(deepLinkFinder(obj))
为什么要投否决票?我犯了错误吗?如果是,请告诉我,以便我可以修复:)