如何在JavaScript中将一维对象转换为多维对象?

如何在JavaScript中将一维对象转换为多维对象?,javascript,object,recursion,Javascript,Object,Recursion,在这里,我编写了一个代码,将多维对象转换为一维对象-> const magic = (obj, parent)=>{ for(let key in obj){ if(typeof obj[key] === 'object') { magic(obj[key], parent+"-"+key); } else{ ans[parent + "-" + key] = obj[key]; } } }

在这里,我编写了一个代码,将多维对象转换为一维对象->

const magic = (obj, parent)=>{
  for(let key in obj){
    if(typeof obj[key] === 'object')
    {
      magic(obj[key], parent+"-"+key);
  }
  else{
    ans[parent + "-" + key] = obj[key];
  }
  }
}

const obj = {
  id: 101,
    email: 'jack@dev.com',
    personalInfo: {
        name: 'Jack',
        address: {
            line1: 'westwish st',
            line2: 'washmasher',
            city: 'wallas',
            state: 'WX'
        }
    }
}

magic(obj, "obj"); 
我试图将这个一维对象再次变成多维对象,但遇到了很多错误。 请帮我写一个函数,将这个一维对象转换成多维对象

转换的1D对象示例:

{
obj-id: 101 ,
obj-email: "jack@dev.com" ,
obj-personalInfo-name: "Jack" ,
obj-personalInfo-address-line1: "westwish st" ,
obj-personalInfo-address-line2: "washmasher" ,
obj-personalInfo-address-city: "wallas" ,
obj-personalInfo-address-state: "WX"
} 

您可以通过首先创建一个结果对象来迭代执行此操作,该对象将包含来自输入对象的键。对于每个关键点,可以按
-
分割,以获取阵列中对象的各个关键点。还可以从关键帧数组中弹出最后一个关键帧,以便在到达最终对象后将其设置为值。对于每个键,可以检查它是否存在于当前对象中,如果存在,则更新当前指针以指向该对象,否则,可以为给定键创建一个新的空对象。到达最后一个对象后,可以将先前从阵列弹出的关键点设置到当前对象上,如下所示:

const reverseMagic=(obj)=>{
常数res={};
for(obj中的常量路径){
const keys=path.split('-');
const last=keys.pop();
//沿着属性向下走,如果属性不存在,则创建它们
设curr=res;
for(键的常数键){
curr[key]=curr[key]| |{};
curr=curr[key];
}
curr[last]=obj[path];
}
返回res;
}
const obj={“obj id”:101,“obj电子邮件”:jack@dev.com“,”obj personalInfo名称“:”杰克“,”obj-personalInfo-address-line1“:”westwish街“,”obj-personalInfo-address-line2“:”洗衣机“,”obj personalInfo地址城市“:”瓦拉斯“,”obj personalInfo地址州“:”WX“};

console.log(reverseMagic(obj))您可以通过首先创建一个结果对象来迭代执行此操作,该对象将包含来自输入对象的键。对于每个关键点,可以按
-
分割,以获取阵列中对象的各个关键点。还可以从关键帧数组中弹出最后一个关键帧,以便在到达最终对象后将其设置为值。对于每个键,可以检查它是否存在于当前对象中,如果存在,则更新当前指针以指向该对象,否则,可以为给定键创建一个新的空对象。到达最后一个对象后,可以将先前从阵列弹出的关键点设置到当前对象上,如下所示:

const reverseMagic=(obj)=>{
常数res={};
for(obj中的常量路径){
const keys=path.split('-');
const last=keys.pop();
//沿着属性向下走,如果属性不存在,则创建它们
设curr=res;
for(键的常数键){
curr[key]=curr[key]| |{};
curr=curr[key];
}
curr[last]=obj[path];
}
返回res;
}
const obj={“obj id”:101,“obj电子邮件”:jack@dev.com“,”obj personalInfo名称“:”杰克“,”obj-personalInfo-address-line1“:”westwish街“,”obj-personalInfo-address-line2“:”洗衣机“,”obj personalInfo地址城市“:”瓦拉斯“,”obj personalInfo地址州“:”WX“};

console.log(reverseMagic(obj))在这里,我可以使用递归执行您需要的操作:

//演示对象
常数x={
obj1:“你好”,
obj2:{
obj3:“你好”,
obj4:{
obj5:“问候”,
obj6:“再见”
}
}
}
函数flatObj(obj){
const flattobj={};//新的一维对象
//循环键
用于(obj中的常量键){
if(对象类型[键]!=“对象”){
//如果不是对象,请将其附加到展平对象
展平obj[key]=obj[key];
}否则{
//如果是对象,请展平对象,然后附加每个关键点
常数温度=扁平对象(对象[键]);
用于(常数临时输入临时值){
flattobj[`${key}-${tempKey}`]=temp[tempKey];
}
}
}
//返回一维对象
返回OBJ;
}
flatObj(x);

在这里,我可以使用递归执行您需要的操作:

//演示对象
常数x={
obj1:“你好”,
obj2:{
obj3:“你好”,
obj4:{
obj5:“问候”,
obj6:“再见”
}
}
}
函数flatObj(obj){
const flattobj={};//新的一维对象
//循环键
用于(obj中的常量键){
if(对象类型[键]!=“对象”){
//如果不是对象,请将其附加到展平对象
展平obj[key]=obj[key];
}否则{
//如果是对象,请展平对象,然后附加每个关键点
常数温度=扁平对象(对象[键]);
用于(常数临时输入临时值){
flattobj[`${key}-${tempKey}`]=temp[tempKey];
}
}
}
//返回一维对象
返回OBJ;
}
flatObj(x);

我们可以在一个函数上构建它,该函数向一个对象添加一个路径,如
['personalInfo','address','city']
和一个相关的值,如下所示:

const addPath=([p,…ps],val,obj)=>
ps.length==0
? {…obj[p]:val}
:{…obj[p]:addPath(ps,val,obj[p]|{}
那么我们的反向魔法函数很简单:

const cigam=(obj)=>/“魔法”向后
Object.entries(obj)
.reduce((a[k,v])=>addPath(k.split('-'),v,a),{})
但是,我也认为您的
magic
函数可以稍微清理一下,特别是当它在其作用域之外改变变量时,
ans
。我经常编写一些版本的
pathEntries
,可以将您的原始版本转换为

[
[id',101],
[‘电子邮件’,'jack@dev.com'],
['personalInfo-name','Jack'],
['personalInfo-address-line1','westwish st'],
['personalInfo-address-line2','washmasher'],
['personalInfo-address-city'、'wallas'],
['personalInfo-address-state','WX']
]
这样,我们就可以编写
magi了