Javascript 如何在js中将对象数组转换为嵌套对象,反之亦然

Javascript 如何在js中将对象数组转换为嵌套对象,反之亦然,javascript,arrays,object,nest-nested-object,Javascript,Arrays,Object,Nest Nested Object,层次结构对象存储在层次结构中的对象数组 财产。对象的嵌套是基于此层次结构完成的 [ { "hierarchy" : ["obj1"], "prop1":"value" }, { "hierarchy" : ["obj1","obj2"], "prop2":"value", "prop3":"value" }, { "hierarchy" : ["obj1","obj3"], "pro

层次结构对象存储在层次结构中的对象数组
财产。对象的嵌套是基于此层次结构完成的

[  
  {
    "hierarchy" : ["obj1"],  
    "prop1":"value" 
  },
  {  
    "hierarchy" : ["obj1","obj2"],  
    "prop2":"value",  
    "prop3":"value"  
  },  
  {  
    "hierarchy" : ["obj1","obj3"],  
    "prop4":"value",  
    "prop5":"value"  
  },  
  {  
    "hierarchy" : ["obj1","obj3", "obj4"],  
    "prop6":"value",  
    "prop7":"value",  
    "arr"  :["val1", "val2"]  
  }
]  
应为嵌套对象,此处删除了层次结构键

{  
  "obj1":{  
    "prop1":"value",  
    "obj2" : {  
      "prop2":"value",  
      "prop3":"value"  
    },  
    "obj3":{  
      "prop4":"value",  
      "prop5":"value",  
      "obj4" : {  
        "prop6":"value",  
        "prop7":"value",  
        "arr"  :["val1", "val2"]  
      }  
    }  
  }  
}  
我尝试过的代码,但在第8行无法获取层次结构

var input = "nested array as above";  
var output = {};  
var globalTemp = output;  
for(var i = 0 ; i<input.length ; i++){  
  var tempObj = input[i];  
  for(var key in tempObj){  
    if(key == "hierarchy"){     
      globalTemp = globlalTemp[tempObj[key]] = {};  
    }  
  }  
}  
console.log(globalTemp);
var input=“如上嵌套数组”;
var输出={};
var globalTemp=输出;

对于(var i=0;i您可以使用
forEach
reduce
方法,在内部创建当前对象的浅层副本并删除
层次结构
属性

const data=[{“hierarchy”:[“obj1”],“prop1”:“value”},{“hierarchy”:[“obj1”,“obj2”],“prop2”:“value”,“prop3”:“value”},{“hierarchy”:[“obj1”,“obj3”,“obj4”],“prop6”:“value”,“prop7”:“value”,“arr”:“val1”,“val2”}]
常量结果={}
data.forEach(函数(o){
o、 层次结构.reduce(函数(r,e){
const clone=Object.assign({},o);
删除clone.hierarchy
返回r[e]=(r[e]|克隆)
},结果)
})

log(result)
对于较新版本的javascript,您可以对所需的值键/值对使用restparameters,并通过保存最后一个属性以分配rest属性来迭代给定的层次结构属性来构建嵌套结构

回收的部分
getFlat
使用数组作为堆栈,而不使用递归调用,以防止深度优先搜索,该搜索尝试首先获取最深的节点

在开始时,堆栈是一个包含实际对象数组的数组,另一个包含空
层次结构
属性和空数组的对象,因为实际上不知道对象的键

然后,一个
while
循环检查堆栈是否有一些项,如果有,它将获取堆栈的第一项,并获取一个对象
o
,获取所有键/值对,以及另一个对象
temp
,该对象具有单个属性
层次结构
,具有指向该对象的路径数组
o

push
标志设置为
false
,因为只有找到的属性稍后才应推送到结果集

现在检查对象的所有属性,如果

  • 该值是真实的(以防止
    null
    值)
  • 类型是一个对象(
    null
    是一个对象),并且
  • 属性不是数组
然后找到一个新对象进行检查。该对象被推送到堆栈中,并带有到堆栈的实际路径

如果没有,则会找到一个值。此键/值对将添加到
temp
对象中,并将标志设置为
true
,以便稍后推送到结果集

继续使用对象的键

稍后检查
push
并将
temp
对象与
hierarchy
属性和自定义属性一起推送到结果集

函数getFlat(对象){ var stack=[[object,{hierarchy:[]}]], 结果=[], 温度,o,推力; while(堆栈长度){ [o,temp]=stack.shift(); 推送=假; Object.keys(o.forEach)(k=>{ if(o[k]&&typeof o[k]='object'&&&!Array.isArray(o[k])){ push([o[k],{hierarchy:temp.hierarchy.concat(k)}]); }否则{ 温度[k]=o[k]; 推送=真; } }); 推送和结果推送(温度); } 返回结果; } 变量数据=[{hierarchy:[“obj1”]、prop1:“value”}、{hierarchy:[“obj1”、“obj2”]、prop2:“value”、prop3:“value”}、{hierarchy:[“obj1”、“obj3”、“obj4”]、prop6:“value”、prop7:“value”、arr:[“val1”、“val2”}, object=data.reduce((r,{hierarchy,…rest})=>{ var last=hierarchy.pop(); reduce((o,k)=>o[k]=o[k]|{},r)[last]=rest; 返回r; }, {}), RecreatedData=getFlat(对象); console.log(对象); console.log(回收数据);

.as控制台包装{最大高度:100%!重要;顶部:0;}
什么不起作用?你能发布你到目前为止尝试过的代码吗?我会添加我尝试过的代码,我无法解决问题。你能解释一下这段代码吗,它会很有帮助。把我当作新手Hey nenad,我已经使用了reduce方法,非常理解代码。你能给我一些反向转换的建议吗(嵌套obj到obj的arr)。Nina谢谢你的回答,我正在尝试理解“getflat”函数。如果可能的话,请解释一下代码。请告诉我你是如何处理这个问题的。“你是如何处理这个问题的?”这是什么意思?实际上我写了一个递归函数,然后发现顺序错误(改为:与给定值不同)并编写了另一个没有递归部分的函数。我的意思是,这种方法非常好,我从来没有这样做过。我只是想了解你是如何打破这个问题并只用几行就解决了它。谢谢你考虑一些方法是一个迭代过程。但是你必须迭代对象的键,看看嵌套对象是否存在,这就是框架。基于堆栈的方法与递归方法的区别来自于尝试和检查结果是否匹配所需的结果。通过递归方法,第一个键最终被推送到结果数组,但通过广度优先搜索,您可以得到所需的结果。