提问者:小点点

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


我试图解剖一个深度嵌套的对象。遍历它并将数据拉到一个单个级别的对象,然后再与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。这只有在我知道它的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的头部。

谢谢!


共1个答案

匿名用户

使用递归来实现这一点。

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);