2017-05-17 12 views
0

私はこの質問は非常に一般的だと確信していますが、私のユースケースでは堅牢な答えが見つからないようです。オブジェクトを含む平坦化された配列

私は2つのレベルでネスティングを持つオブジェクトの配列を持っています。ここでは、配列の例です:

let array = [ 
{ company: 'CompanyName1', 
    child: [ 
     { title: 'title1a', 
     baby: [ 
      { title: 'title1ab' }, 
      { title: 'title1abc' } 
     ] 
     }, 
     { title: 'title2a', 
     baby: [ 
      { title: 'titleb2abcd' }, 
      { title: 'titleb2abcde' } 
     ] 
     }   
    ] 
}, 
{ company: 'CompanyName2', 
    child: [ 
     { title: 'title2b', 
     baby: [ 
      { title: 'titleb3ab' }, 
      { title: 'titleb3abc' } 
     ] 
     }   
    ] 
} 
] 

そして、これは私の予想配列である:

let newArray = [ 
    { 
    company: 'companyName1', 
    child_title_0: 'title1a', 
    child_title_1: 'title1a', 
    child_baby_0: 'title1ab', 
    child_baby_1: 'title1abc', 
    child_baby_2: 'title1abcd', 
    child_baby_3: 'title1abcde', 
    }, 
    { 
    company: 'companyName2', 
    child_title_0: 'title2b', 
    child_baby_0: 'titleb3ab', 
    child_baby_1: 'titleb3abc', 
    } 
    ] 

基本的に私は、アレイのトップレベルのオブジェクトのそれぞれを平らにする必要があります。ネストされたオブジェクトは同じキーを持っているので(モデルに従う、動的である - いくつかのアイテムにはネストされたオブジェクトが10個あり、いくつかは0など)、新しいキーのそれぞれを動的に生成する必要があります。 。

どのようなヘルプ - 方向が高く評価されます。

ありがとうございます!

+0

おかげ - それは編集されています。 – mmarquez

答えて

3

map関数を使用して、配列内の各オブジェクトの操作されたバージョンを返すことができます。補正のための

let results = [ 
 
    { 
 
    company: 'CompanyName1', 
 
    child: [ 
 
     { 
 
      title: 'title1a', 
 
      baby: [ 
 
      { title: 'title1ab' }, 
 
      { title: 'title1abc' } 
 
      ] 
 
     }, 
 
     { 
 
      title: 'title2a', 
 
      baby: [ 
 
      { title: 'titleb2abcd' }, 
 
      { title: 'titleb2abcde' } 
 
      ] 
 
     }   
 
    ] 
 
    }, 
 
    { 
 
    company: 'CompanyName2', 
 
    child: [ 
 
     { 
 
      title: 'title2b', 
 
      baby: [ 
 
      { title: 'titleb3ab' }, 
 
      { title: 'titleb3abc' } 
 
      ] 
 
     }   
 
    ] 
 
    } 
 
]; 
 

 
let flattened = results.map(company => { 
 
    let childCount = 0, babyCount = 0; 
 
    company.child.forEach(child => { 
 
    company['child_title_'+childCount] = child.title; 
 
    child.baby.forEach(baby => { 
 
     company['child_baby_'+babyCount] = baby.title; 
 
     babyCount++; 
 
    }); 
 
    childCount++; 
 
    }); 
 
    delete company.child; 
 
    return company; 
 
}); 
 

 
console.log(flattened);

+0

質問によれば、ネストされたオブジェクトが「n」レベル深くなる可能性があるので、これは再帰的である必要があります。 – mhodges

+1

@mhodges誤解しやすい*基本的には、配列のトップレベルの各オブジェクトを平坦化する必要があります。おそらく、再帰的に平坦化を追加します。 –

+0

みなさんありがとう!再帰的に平坦化するとより意味があります。この答えは、私の実際のデータモデルを少し調整して私の仕事をしてくれました。 – mmarquez

関連する問題