2017-10-25 2 views
2

私はfollowngデータモデルがありますので、構造は両親、子供や孫であるこのデータを元の平坦でない形状に合わせて再構成するにはどうすればよいですか?

NEW MODEL

[ 
     { 
      name : 'Tony', 
      id : 'Tony_id' 
     },{ 
      name: 'Barry', 
      id: 'Barry_id', 
      parentId: 'Tony_id' 
     },{ 
      name: 'George', 
      id: 'George_id', 
      parentId: 'Barry_id' 
     },{ 
      name : 'Laura', 
      id : 'Laura_id', 
      parentId: 'Barry_id' 
     },{ 
      name: 'Edward', 
      id: 'Edward_id' 
     },{ 
      name: 'Patrick', 
      id: 'Patrick_id', 
      parentId: 'Edward_id' 
     } 
    ] 

。最初のモデルは、次のように見えたが、私はそれを平らにする必要がありました:

OLD MODEL私は古いモデルへの参照を失ってしまった

[ 

     { 
      name : 'Tony', 
      id : 'Tony_id', 
      children: [ 
       { 
        name: 'Barry', 
        id: 'Barry_id', 
        parentId: 'Tony_id', 
        children: [ 
         { 
          name: 'George', 
          id: 'George_id', 
          parentId: 'Barry_id' 
         },{ 
          name : 'Laura', 
          id : 'Laura_id', 
          parentId: 'Barry_id' 
         } 
        ] 
       } 
      ] 
     },{ 
      name: 'Edward', 
      id: 'Edward_id', 
      children: [ 
       { 
        name: 'Patrick', 
        id: 'Patrick_id', 
        parentId: 'Edward_id' 
       } 
      ] 
     } 
    ] 

NEW MODELだけを使用して、旧モデルに合わせてどのように再構成できますか?と同じですか?

+0

あなたはこれまでに何をしましたか? ---あなたは再帰的な削減を使用することについて考えましたか? – evolutionxbox

+0

@evolutionxboxいいえ、私はこの1つでかなり困惑しています。私はこのようなデータをどのようにして平らにするのか不明です。 – Daft

+0

丸ごとの "親"参照があれば、大きな問題に直面する可能性があります。 – evolutionxbox

答えて

1

あなたは親子関係を維持するためのオブジェクトを持つツリーを構築することができます。

この提案は、ソートされていないデータに対しても機能します。 (楽しみのために)

var data = [{ name: 'Tony', id: 'Tony_id' }, { name: 'Barry', id: 'Barry_id', parentId: 'Tony_id' }, { name: 'George', id: 'George_id', parentId: 'Barry_id' }, { name: 'Laura', id: 'Laura_id', parentId: 'Barry_id' }, { name: 'Edward', id: 'Edward_id' }, { name: 'Patrick', id: 'Patrick_id', parentId: 'Edward_id' }], 
 
    tree = function (data, root) { 
 
     var r = [], o = {}; 
 
     data.forEach(function (a) { 
 
      if (o[a.id] && o[a.id].children) { 
 
       a.children = o[a.id] && o[a.id].children; 
 
      } 
 
      o[a.id] = a; 
 
      if (a.parentId === root) { 
 
       r.push(a); 
 
      } else { 
 
       o[a.parentId] = o[a.parentId] || {}; 
 
       o[a.parentId].children = o[a.parentId].children || []; 
 
       o[a.parentId].children.push(a); 
 
      } 
 
     }); 
 
     return r; 
 
    }(data, undefined); 
 

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

+0

申し訳ありませんが、データを平坦化しているようですか?たぶん私の質問は明確ではありませんが、実際には逆のことをしています – Daft

+0

木を欲しいですか? –

+0

はい、私のデータがフラットな瞬間、私はそれを逆にしたいと思います。 – Daft

1

あなたは再帰的にそれを行うことができます。

var newData = [ 
 

 
     { 
 
      name : 'Tony', 
 
      id : 'Tony_id', 
 
      children: [ 
 
       { 
 
        name: 'Barry', 
 
        id: 'Barry_id', 
 
        parentId: 'Tony_id', 
 
        children: [ 
 
         { 
 
          name: 'George', 
 
          id: 'George_id', 
 
          parentId: 'Barry_id' 
 
         },{ 
 
          name : 'Laura', 
 
          id : 'Laura_id', 
 
          parentId: 'Barry_id' 
 
         } 
 
        ] 
 
       } 
 
      ] 
 
     },{ 
 
      name: 'Edward', 
 
      id: 'Edward_id', 
 
      children: [ 
 
       { 
 
        name: 'Patrick', 
 
        id: 'Patrick_id', 
 
        parentId: 'Edward_id' 
 
       } 
 
      ] 
 
     } 
 
    ]; 
 

 
function flat(datas, flatten) { 
 
    datas.forEach(el => { 
 
     flatten.push(el); 
 
     if (el.children) { 
 
      flat(el.children, flatten); 
 
      delete el.children; 
 
     } 
 
    }); 
 
} 
 

 
var flatten = []; 
 
flat(newData, flatten); 
 
console.log(flatten);

EDIT:逆を行うには:

var data = [{ name: 'Tony', id: 'Tony_id' }, { name: 'Barry', id: 'Barry_id', parentId: 'Tony_id' }, { name: 'George', id: 'George_id', parentId: 'Barry_id' }, { name: 'Laura', id: 'Laura_id', parentId: 'Barry_id' }, { name: 'Edward', id: 'Edward_id' }, { name: 'Patrick', id: 'Patrick_id', parentId: 'Edward_id' }]; 
 

 
function ToTree(arrayItems) { 
 
    var map = {}, roots = []; 
 
    arrayItems.forEach((item, i) => { 
 
     map[item.id] = i; 
 
     item.children = []; 
 
    }); 
 
    arrayItems.forEach(node => { 
 
     if (node.parentId && arrayItems[map[node.parentId]]) { 
 
      arrayItems[map[node.parentId]].children.push(node); 
 
     } else { 
 
      roots.push(node); 
 
     } 
 
    }); 
 
    return roots;  
 
} 
 

 
var myTree = ToTree(data); 
 
console.log(myTree);

+0

答えがありがたいですが、データを平坦化しているようですね。多分私の質問ははっきりしていませんが、私は実際にその逆をしたいと思っています。 – Daft

0

そして、反対:

let oldData = [ 
 
    {name : 'Tony', id : 'Tony_id'}, 
 
    {name: 'Barry', id: 'Barry_id', parentId: 'Tony_id'}, 
 
    {name: 'George', id: 'George_id', parentId: 'Barry_id'}, 
 
    {name : 'Laura', id : 'Laura_id', parentId: 'Barry_id'}, 
 
    {name: 'Edward', id: 'Edward_id'}, 
 
    {name: 'Patrick', id: 'Patrick_id', parentId: 'Edward_id'} 
 
] 
 

 
// First we need a Key-Data object with : 
 
// Key : person's id 
 
// Value : person's data 
 
let dwKeys = {} 
 
oldData.forEach(d => dwKeys[d.id] = d) ; 
 

 

 
// The same objects with children 
 

 
let dwChildren = {} ; 
 

 
// Then we can know who's who 
 

 
for(let uid in dwKeys) 
 
{ 
 
    
 
    // We take the person's data 
 
    let udata = dwKeys[uid] ; 
 
    
 
    // we take the parent (if any) 
 
    
 
    let parentId = udata.parentId ; 
 
    
 
    // No parent ? OK => root person 
 
    
 
    if (! parentId) { 
 
    dwChildren[uid] = udata ; 
 
    continue ; 
 
    } 
 
    
 
    // Now, we add the child to their parent 
 
    
 
    // Do the record if needed 
 
    
 
    if (undefined === dwChildren[parentId]){ 
 
    dwChildren[parentId] = dwKeys[parentId] ; 
 
    } 
 
    
 
    // Do the children field if needed 
 
    
 
    if (undefined === dwChildren[parentId]['children']){ 
 
    dwChildren[parentId]['children'] = []; 
 
    } 
 
    
 
    // Add this child 
 
    
 
    delete udata.parentId ; 
 
    dwChildren[parentId]['children'].push(udata); 
 
    
 
} 
 

 
// Hey no, it doesn't work: 
 
// dwChildren = dwChildren.values() ; 
 
// So: 
 

 
let awChildren = [] ; // for "Array With Children" 
 

 
for (let uid in dwChildren) { awChildren.push(dwChildren[uid]) } 
 

 

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

関連する問題