Javascript 移动嵌套对象并从中构建平面对象

Javascript 移动嵌套对象并从中构建平面对象,javascript,arrays,json,Javascript,Arrays,Json,我有一个需要遍历的对象数组,随着深度的增加,我需要在每个节点上指定treeLevel属性。 我创建了以下plunker, 我已经计算出了移动部分,但我无法了解如何分配每个节点上的树级别 sampleInput = [ { sectorName: 'a', sectorType: 'a', sectors: [ { sectorName: 'a-a1', sectorType: 'a-a1',

我有一个需要遍历的对象数组,随着深度的增加,我需要在每个节点上指定treeLevel属性。 我创建了以下plunker, 我已经计算出了移动部分,但我无法了解如何分配每个节点上的树级别

sampleInput = [
    {
      sectorName: 'a',
      sectorType: 'a',
      sectors: [
        {
          sectorName: 'a-a1',
          sectorType: 'a-a1',
          sectors: [
            {
              sectorName: 'a-a1-a1',
              sectorType: 'a-a1-a1',  
            },
            {
              sectorName: 'a-a1-a2',
              sectorType: 'a-a1-a2',  
            },
            {
              sectorName: 'a-a1-a3',
              sectorType: 'a-a1-a3',
            }
          ]
        },
        {
          sectorName: 'a-a2',
          sectorType: 'a-a2',
        },
        {
          sectorName: 'a-a3',
          sectorType: 'a-a3',
          sectors: [
            {
              sectorName: 'a-a3-a1',
              sectorType: 'a-a3-a1',  
              sectors: [
                {
                  sectorName: 'a-a3-a1-a1',
                  sectorType: 'a-a3-a1-a1',
                }
              ]
            }
          ]
        }
      ]
    },
    {
      sectorName: 'b',
      sectorType: 'b',
    },
    {
      sectorName: 'c',
      sectorType: 'c',
      sectors: [
        {
            sectorName: 'c-c1',
            sectorType: 'c-c2',
        }
      ]
    }
  ];
下面是我期望的输出

"[
  {"sectorName":"a","sectorType":"a","$$treeLevel":0},
  {"sectorName":"a-a1","sectorType":"a-a1","$$treeLevel":1},
  {"sectorName":"a-a1-a1","sectorType":"a-a1-a1","$$treeLevel":0},
  {"sectorName":"a-a1-a2","sectorType":"a-a1-a2","$$treeLevel":0},
  {"sectorName":"a-a1-a3","sectorType":"a-a1-a3","$$treeLevel":0},
  {"sectorName":"a-a2","sectorType":"a-a2","$$treeLevel":0},
  {"sectorName":"a-a3","sectorType":"a-a3","$$treeLevel":1},
  {"sectorName":"a-a3-a1","sectorType":"a-a3-a1","$$treeLevel":2},
  {"sectorName":"a-a3-a1-a1","sectorType":"a-a3-a1-a1","$$treeLevel":3},    
  {"sectorName":"b","sectorType":"b","$$treeLevel":0},
  {"sectorName":"c","sectorType":"c","$$treeLevel":0},
  {"sectorName":"c-c1","sectorType":"c-c2","$$treeLevel":1}
]"
递增treeLevel的逻辑是,如果我们有一个扇区数组作为当前对象的一部分,那么复制当前对象并将其赋值为treeLevel,递增treeLevel,然后递归。 但请注意,同一父级的直接子级将被分配正确的树级别。例如,上面的
{“sectorName”:“a-a3”,“sectorType”:“a-a3”,“$$treeLevel”:1},
'a-a3'作为'a-a1'的直接子级将被分配treeLevel为1,而不是零

有人能帮我解决这个问题吗。我只需要弄清楚如何让treelevel作业正常工作。我对所有的解决方案都持开放态度,递归的、非递归的、使用lodash库的等等


提前谢谢

您可以存储实际级别并在每个嵌套级别上递增它

函数getFlat(数组){ var结果=[]; 数组.forEach(函数平面(级别){ 返回函数(o){ 结果.push({sectorName:o.sectorName,sectorType:o.sectorType,$$treeLevel:level}); o、 扇区和o.sections.forEach(平面(标高+1)); }; }(0)); 返回结果; } var数据=[{sectorName:'a',sectorName:'a-a1',sectorType:'a-a1',sectors:[{sectorName:'a-a1-a1',sectorType:'a-a1-a1',},{sectorName:'a-a1-a2',sectorType:'a-a1-a2',},{sectorName:'a-a1-a3',sectorType:'a-a1-a3',},},{sectorName:'a-a2',sectorName:'a-a2',{sectorName:'a-a3',sectorType:'a-a3',扇区:[{sectorName:'a-a3-a1',扇区:[{sectorName:'a-a3-a1-a1',sectorType:'a-a3-a1-a1',}]}],{sectorName:'b',},{sectorName:'c',sectorType:'c',扇区:[{sectorName:'c-c1',sectorType:'c-c2',}], 结果=getFlat(数据); console.log(结果);
。作为控制台包装{max height:100%!important;top:0;}
您可以存储实际级别并在每个嵌套级别上递增它

函数getFlat(数组){ var结果=[]; 数组.forEach(函数平面(级别){ 返回函数(o){ 结果.push({sectorName:o.sectorName,sectorType:o.sectorType,$$treeLevel:level}); o、 扇区和o.sections.forEach(平面(标高+1)); }; }(0)); 返回结果; } var数据=[{sectorName:'a',sectorName:'a-a1',sectorType:'a-a1',sectors:[{sectorName:'a-a1-a1',sectorType:'a-a1-a1',},{sectorName:'a-a1-a2',sectorType:'a-a1-a2',},{sectorName:'a-a1-a3',sectorType:'a-a1-a3',},},{sectorName:'a-a2',sectorName:'a-a2',{sectorName:'a-a3',sectorType:'a-a3',扇区:[{sectorName:'a-a3-a1',扇区:[{sectorName:'a-a3-a1-a1',sectorType:'a-a3-a1-a1',}]}],{sectorName:'b',},{sectorName:'c',sectorType:'c',扇区:[{sectorName:'c-c1',sectorType:'c-c2',}], 结果=getFlat(数据); console.log(结果);
.as控制台包装{最大高度:100%!重要;顶部:0;}
为什么较深的级别会在想要的结果中产生零级别?树级别应该表示深度。因此,如果您的对象中没有任何子扇区,我将分配一个0级别的树级别以表示没有更多深度。但是,稍后我更新了代码,并从没有深度的对象中删除了树级别儿童,因为它更有意义。为什么更深的级别在想要的结果中产生零级别?树级别应该表示深度。因此,如果您的对象中没有更多的子扇区,我将指定一个零的树级别以表示没有更多的深度。但是,后来我更新了代码,并从obje中完全删除了树级别cts没有任何子级,因为它更有意义。flat()完成了这个技巧。我在编写traverse()时忽略了这一点。我更专注于遍历数组,但我没有注意treeLevel道具。谢谢……flat()完成了这个技巧。我在编写traverse()时忽略了这一点.我更专注于穿越阵列,但我没有注意treeLevel道具。谢谢。。。