我试图解剖一个深度嵌套的对象。遍历它并将数据拉到一个单个级别的对象,然后再与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。这只有在我知道它的4个物体深度的情况下才起作用。实际上它可以是1->n深。我还有一个函数,它在该级别检查值的类型,并对其进行相应的处理。现在这对我很管用
const pivotInfo = []
const topLevelObjects = pivotResponse.pivots.pivotObjects[pivotsString]
for(const level0 of topLevelObjects){
let newPivotInfo = {}
//This is assuming you can only pivot 4 deep.
newPivotInfo[level0.field] = level0.value
if(level0.pivot){
for(const level1 of level0.pivot){
newPivotInfo = {...newPivotInfo, ...buildBasedOnType(level1, newPivotInfo)}
if(level1.pivot){
for(const level2 of level1.pivot) {
newPivotInfo = {...newPivotInfo, ...buildBasedOnType(level2, newPivotInfo)}
if(level2.pivot){
for(const level3 of level2.pivot) {
newPivotInfo = {...newPivotInfo, ...buildBasedOnType(level3, newPivotInfo)}
}
}
}
}
}
}
pivotInfo.push(newPivotInfo)
}
这里是顶层
{
'pivotvalue0,pivotvalue1,pivotvalue2,pivotvalue3': [
{
field: 'pivotvalue0',
value: '200275399',
count: 36,
pivot: [Array]
},
{
field: 'pivotvalue0',
value: '200746617',
count: 23,
pivot: [Array]
}
]
}
下面是每一个级别:
{
field: 'pivotvalue1',
value: 'Yes',
count: 27,
pivot: [
{ field: 'pivotvalue2', value: 'Hello', count: 27, pivot: [Array] }
]
}
{
field: 'pivotvalue1',
value: 'Maybe',
count: 9,
pivot: [
{ field: 'pivotvalue2', value: 'Hello', count: 9, pivot: [Array] }
]
}
{
field: 'pivotvalue1',
value: 'No',
count: 23,
pivot: [
{ field: 'pivotvalue2', value: 'World', count: 12, pivot: [Array] },
{ field: 'pivotvalue2', value: 'Mars', count: 11, pivot: [Array] }
]
}
希望这是足够的上下文来了解我当前在做什么。现在,我有数据可以通过一个数组的值知道这些对象的深度。这样我就可以检查阵列长度,知道我需要去多深。什么是最好的方法使这一动态?所以它会弯曲到'n'深度,而不是编码为4的头部。
谢谢!
使用递归来实现这一点。
null
var data = [
{
field: 'pivotvalue0',
value: '200275399',
count: 36,
pivot: [{
field: 'pivotvalue0.1',
value: '200275399',
count: 36,
pivot: [{
field: 'pivotvalue0.2',
value: '200275399',
count: 36,
pivot: []
}]
}]
},
{
field: 'pivotvalue0',
value: '200746617',
count: 23,
pivot: []
}
]
var finalResult = [];
function accumulateValue(data){
data.forEach(item=>{
finalResult.push({
field: item.field,
value: item.value,
count: item.count,
});
if(item.pivot && item.pivot.length){
accumulateValue(item.pivot)
}
})
}
accumulateValue(data)
console.log(finalResult);