当前位置: 首页 > 知识库问答 >
问题:

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

谢典
2023-03-14

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

支才
2023-03-14

使用递归来实现这一点。

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);
 类似资料:
  • 问题内容: 我试图遍历嵌套对象以检索由字符串标识的特定对象。在下面的示例对象中,标识符字符串是“ label”属性。我无法解决如何遍历树以返回适当对象的问题。任何帮助或建议,将不胜感激。 问题答案: 您可以创建像这样的递归函数来对对象进行深度优先遍历。 可以这样称呼

  • 问题内容: 我目前有这个: test.json看起来像这样: 我越来越: 如何更改它,以便无论我拥有多少嵌套值,它都将循环遍历所有嵌套项目? 所以对于上面的例子,我会得到 问题答案: 您可以创建一个递归循环函数,但是会遇到一个问题:当属性是对象时,因为没有字符串,所以没有文本可显示。因此,您将得到: 因为while 是为项目#2显示的字符串,所以它是为项目#1显示的对象。 无论如何,这就是我组成的

  • 问题内容: 我必须遍历json数组对象。 它具有以下结构。 基本上我在做的是prod_1是产品的名称,并且prod_1的版本列表已填充在其中。 所以现在我想要的是产品的名称以及它的版本。 问题在于可能有很多产品和该产品下的许多版本。所以我需要可以在 javascript 中使用适当的循环结构来对其进行处理。 最好将循环将产品名称存储在一个变量中,将版本存储在另一个变量中,因为我需要对产品名称进行一

  • def deep(root): if not root: return print root.data deep(root.left) deep(root.right) if __name__ == '__main__': lookup(tree) deep(tree)

  • 问题内容: 我的数据库中有一个表,其中使用混合嵌套集(MPTT)模型(具有和的值)和邻接列表模型(存储在每个节点上)存储树结构。 这个问题与树的任何MPTT方面都不相关,但是我想我将其保留,以防万一有人对如何利用它有个好主意。 我想将别名的路径转换为特定的节点。例如:将找到别名为“ nickf”的节点,该节点是别名为“ admins”的节点的子节点,别名为“ users”的根节点。上有一个唯一索引

  • 给定一个数组,构建二叉树,并且按层次打印这个二叉树