2017-01-04 4 views
1

現在、同じ種類の配列を持つX量のjavascriptオブジェクトの配列を処理しています(この場合、 'modelChildren')正しく入れ子にして、それらの内部に配列を持つjavascriptオブジェクトの配列を平坦化する方法(X回目)

これをオブジェクトの1つの配列にフラット化し、見つかったレベルを返したいと思います。多くの状況でlodashを使用するので、解決策はプレーンなjavascriptである必要はありません。理想的には、一度終了した 'modelChildren'フィールドも削除したいと思います。

ご協力いただければ幸いです。 ありがとう!

入力:

[{ 
    id: 1, 
    name: foo 
    modelChildren: [ 
    { 
    id: 2, 
    name: bar, 
    modelChildren: [ 
     { 
     id: 3, 
     name: foobar 
     }, 
     { 
     id: 4, 
     name: foobarfoo 
     } 
    ] 
    } 
    ] 
}] 

期待される結果:

[{ 
    id: 1, 
    name: foo, 
    level: 1 
{ 
    id: 2, 
    name: bar, 
    level: 2 
}, 
{ 
    id: 3, 
    name: foobar, 
    level: 3 
}, 
{ 
    id: 4, 
    name: foobarfoo 
    level: 3 
}] 

答えて

1

これは非常に簡単にすることができ、それはしばらく、あなたはそれを横断し、レベルを覚えておく必要がちょうどTree Traversal

ですあなたがそれらの中にいるときに "ノード"を格納する。例えば

この出力

[ { level: 1, id: 1, name: 'foo' }, 
    { level: 2, id: 2, name: 'bar' }, 
    { level: 3, id: 3, name: 'foobar' }, 
    { level: 3, id: 4, name: 'foobarfoo' }, 
    { level: 1, id: 5, name: 'foo' }, 
    { level: 2, id: 6, name: 'bar' }, 
    { level: 3, id: 7, name: 'foobar' }, 
    { level: 3, id: 8, name: 'foobarfoo' }, 
    { level: 2, id: 9, name: 'bar' }, 
    { level: 3, id: 10, name: 'foobar' }, 
    { level: 3, id: 11, name: 'foobarfoo' } ] 
を有する本コード

const source = [{ 
    id: 1, 
    name: 'foo', 
    modelChildren: [ 
     { 
      id: 2, 
      name: 'bar', 
      modelChildren: [ 
       { 
        id: 3, 
        name: 'foobar' 
       }, 
       { 
        id: 4, 
        name: 'foobarfoo' 
       } 
      ] 
     } 
    ], 
}, { 
    id: 5, 
    name: 'foo', 
    modelChildren: [ 
     { 
      id: 6, 
      name: 'bar', 
      modelChildren: [ 
       { 
        id: 7, 
        name: 'foobar' 
       }, 
       { 
        id: 8, 
        name: 'foobarfoo' 
       } 
      ] 
     }, 
     { 
      id: 9, 
      name: 'bar', 
      modelChildren: [ 
       { 
        id: 10, 
        name: 'foobar' 
       }, 
       { 
        id: 11, 
        name: 'foobarfoo' 
       } 
      ] 
     } 
    ], 
} 
]; 
const newSource = []; 
const _ = require('lodash'); 

function doIt(items, level) { 
    if (!items) { 
     return; 
    } 

    items.forEach(item => { 
     newSource.push(_.merge({level}, _.pick(item, ['id', 'name']))); 
     doIt(item.modelChildren, level + 1); 
    }) 
} 

doIt(source, 1); 
console.log(newSource); 

関連する問題