2017-09-24 69 views
1

我有一个需要遍历的对象数组,随着深度的变化,我需要在每个节点上分配一个treeLevel属性。 我创建了以下plunker,https://plnkr.co/edit/wou4Vj?p=info 我已经想出了旅行部分,但我无法了解如何在每个节点上分配treeLevels。旅行嵌套对象并从中构建一个平面对象

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而不是零。

有人能帮我解决这个问题。我只需要弄清楚如何让树型分配工作。我对所有的解决方案都是开放的,递归的,非递归的,使用lodash lib等等。

在此先感谢。

+0

为什么更深层次的通缉的结果产生的零的水平? –

+0

treeLevel应该表示深度。因此,如果你的对象没有更多的子节点,我将分配一个零树层来表示没有更多的深度。然而,后来我更新了我的代码,并从没有任何子项的对象中删除了treeLevel,因为它更有意义。 – digitalis

回答

0

您可以存储实际级别并将其增加到每个嵌套级别。

function getFlat(array) { 
 
    var result = []; 
 
    array.forEach(function flat(level) { 
 
     return function (o) { 
 
      result.push({ sectorName: o.sectorName, sectorType: o.sectorType, $$treeLevel: level }); 
 
      o.sectors && o.sectors.forEach(flat(level + 1)); 
 
     }; 
 
    }(0)); 
 
    return result; 
 
} 
 

 
var data = [{ 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', }] }], 
 
    result = getFlat(data); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

平板()做到了。当我编写遍历()时,这不知何故错过了。我更专注于遍历它所做的数组,但我没注意treeLevel的道具。谢谢... – digitalis