Javascript 动态遍历深嵌套对象并累积结果

Javascript 动态遍历深嵌套对象并累积结果,javascript,node.js,recursion,traversal,Javascript,Node.js,Recursion,Traversal,我试图解剖一个嵌套很深的物体。遍历它并将数据拉到一个级别的对象上,然后该对象与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。如中所示,只有当我知道它的4个对象的深度时,这才有效。实际上,它可以是1->n深。我还有一个函数,可以检查该级别的值的类型,并相应地对其进行处理。现在这对我很有用 run(); 函数运行(){ 常量topLevelObjects=[{ 字段:“pivotvalue0”, 值:“111111111”, 计数:36, 支点:[{ 字段:“pivotval

我试图解剖一个嵌套很深的物体。遍历它并将数据拉到一个级别的对象上,然后该对象与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。如中所示,只有当我知道它的4个对象的深度时,这才有效。实际上,它可以是1->n深。我还有一个函数,可以检查该级别的值的类型,并相应地对其进行处理。现在这对我很有用

run();
函数运行(){
常量topLevelObjects=[{
字段:“pivotvalue0”,
值:“111111111”,
计数:36,
支点:[{
字段:“pivotvalue1”,
值:“Y”,
计数:27,
支点:[{
字段:“pivotvalue2”,
值:'Header1',
计数:27,
支点:[{
字段:“pivotvalue3”,
值:“Value1”,
计数:14
},
{
字段:“pivotvalue3”,
值:“Value2”,
计数:13
}
]
}]
},
{
字段:“pivotvalue1”,
值:“Z”,
计数:9,
支点:[{
字段:“pivotvalue2”,
值:'Header2',
计数:9,
支点:[{
字段:“pivotvalue3”,
值:“Value1”,
计数:9
}]
}]
}
]
},
{
字段:“pivotvalue0”,
值:“2222222”,
计数:23,
支点:[{
字段:“pivotvalue1”,
值:“Y”,
计数:23,
支点:[{
字段:“pivotvalue2”,
值:'Header1',
计数:12,
支点:[{
字段:“pivotvalue3”,
值:“Value2”,
计数:12
}]
},
{
字段:“pivotvalue2”,
值:'Header2',
计数:11,
支点:[{
字段:“pivotvalue3”,
值:“Value2”,
计数:11
}]
}
]
}]
}
]
//pivotResponse.facet\u计数。facet\u pivot[pivotsString]
常量累计数据透视信息=[]
//这是假设你只能旋转4个深度。我很想知道如何使这个动态。
用于(topLevelObjects的常量level0){
让newPivotInfo={}
newPivotInfo[level0.field]=level0.value
如果(0级枢轴){
用于(0.pivot级别的常量级别1){
newPivotInfo={
…新数据透视信息,
…buildBasedOnType(级别1,新数据透视信息)
}
如果(1级枢轴){
用于(第1级枢轴的第2级常量){
newPivotInfo={
…新数据透视信息,
…buildBasedOnType(级别2,新数据透视信息)
}
如果(2级枢轴){
用于(第2级枢轴的第3级施工){
newPivotInfo={
…新数据透视信息,
…buildBasedOnType(级别3,新数据透视信息)
}
}
}
}
}
}
}
累计数据透视信息。推送(新数据透视信息)
}
console.log(累计数据透视信息)
}
函数buildBasedOnType(级别,newPivotInfo){
如果(level.field=='pivotvalue1'){
level.value=='Y'?newPivotInfo['pivotvalue1.1']=level.count:newPivotInfo['pivotvalue1.1']=0
level.value=='N'?newPivotInfo['pivotvalue1.2']=level.count:newPivotInfo['pivotvalue1.2']=0
level.value=='Z'?newPivotInfo['pivotvalue1.3']=level.count:newPivotInfo['pivotvalue1.3']=0
}else if(level.field=='pivotvalue2'| | level.field==='pivotvalue3'){
newPivotInfo[level.field+'s']==未定义?newPivotInfo[level.field+'s']=新集合([level.value]):newPivotInfo[level.field+'s']。添加(level.value)
}否则{
newPivotInfo[level.field]=level.value
}
返回newPivotInfo

}
使用递归来实现这一点

var数据=[
{
字段:“pivotvalue0”,
值:“200275399”,
计数:36,
支点:[{
字段:“pivotvalue0.1”,
值:“200275399”,
计数:36,
支点:[{
字段:“pivotvalue0.2”,
值:“200275399”,
计数:36,
枢轴:[]
}]
}]
},
{
字段:“pivotvalue0”,
值:“200746617”,
计数:23,
枢轴:[]
}
]
var finalResult=[];
函数累计值(数据){
data.forEach(项=>{
最后的结果({
字段:item.field,
值:item.value,
计数:item.count,
});
if(item.pivot&&item.pivot.length){
累计值(项目透视)
}
})
}
累加值(数据)

控制台日志(最终结果)使用递归来实现这一点

var数据=[
{
字段:“pivotvalue0”,
值:“200275399”,
计数:36,
支点:[{
字段:“pivotvalue0.1”,
值:“200275399”,
计数:36,
支点:[{
字段:“pivotvalue0.2”,
值:“200275399”,
计数:36,
枢轴:[]
}]
}]
},
{
字段:“pivotvalue0”,
值:“200746617”,
计数:23,
枢轴:[]
}
]
var finalResult=[];
函数累计值(数据){
data.forEach(项=>{
最后的结果({
字段:item.field,
值:item.value,
计数:item.count,
});
if(item.pivot&&item.pivot.length){
累计值(项目透视)
}
})
}
累加值(数据)

控制台日志(最终结果)这里有一种递归执行此操作的方法。我们为您想要专门处理的类型添加了特殊情况,对于所有其他情况,我们向正在运行的输出对象添加
{[field]:value}

需要注意的主要问题是递归是自动化的。我们不需要手动编写这些级别的代码,这应该可以让我们任意深入

//实用函数
常量聚集=(属性)=>(fn)=>(o)=>
[...