2017-09-06 48 views
2

我想使模型分支具有類似於思維導圖的功能,它具有「父」和「子」值。它看起來像:創建mongodb對象的思維導圖

Branches = [{ 
children: {}, 
_id: String, 
parent: { type: Schema.Types.ObjectId, ref: 'Branch' } 
}] 

,我希望得到的東西,如:

[ 
{ 
    "_id": "599c1f79f339dc3991d8250a", 
    "name": "Robert", 
    "children": [ 
     { 
      "_id": "599c1f82f339dc3991d8250b", 
      "name": "Robert 1", 
      "parent": "599c1f79f339dc3991d8250a", 
      "children": [ 
       { 
        "_id": "599c1f8ff339dc3991d8250c", 
        "name": "Robert 2", 
        "parent": "599c1f82f339dc3991d8250b", 
        "children": [ 
         { 
          "_id": "599c2b7373a7d43e5205af1f", 
          "name": "Robert 4", 
          "parent": "599c1f8ff339dc3991d8250c", 
          "__v": 0, 
          "shareholder": [], 
          "createdDate": "2017-08-22T13:02:43.290Z", 
          "children": [] 
         } 
        ], 
        "__v": 0, 
        "shareholder": [], 
        "createdDate": "2017-08-22T12:11:59.230Z" 
       }, 
       { 
        "_id": "599c1f9df339dc3991d8250d", 
        "name": "Robert 3", 
        "parent": "599c1f82f339dc3991d8250b", 
        "children": [], 
        "__v": 0, 
        "shareholder": [], 
        "createdDate": "2017-08-22T12:12:13.156Z" 
       } 
      ], 
      "__v": 0, 
      "shareholder": [], 
      "createdDate": "2017-08-22T12:11:46.938Z" 
     } 
    ], 
    "__v": 0, 
    "parent": null, 
    "shareholder": [], 
    "createdDate": "2017-08-22T12:11:37.005Z" 
} 

]」

如果一個對象有親值 「1」,分支_id: 「1」 必須我的代碼現在是:

Branch.find((err, foundedBranches) => { 

function createTree(branch) { 
    function inner(parent) { 
     return branch.filter(x => x.parent === parent) 
       .map(x => { 
        x.children = inner(x._id) 
        return x 
       }) 
    } 
    return inner(null) 
} 
let formated = createTree(branches) 
res.json(formated) 

如果你知道如何解決它,請幫助:/

回答

0

什麼這樣的事 - 你會得到孩子的每一個條目

// All items from database 
const dataFromDatabase = // ... 

// For each item, go and look for childrens 
const finalMap = dataFromDatabase.map((x) => { 
    children: this.getChildren(dataFromDatabase, x._id), 
    _id: x._id, 
    // ... 
}); 

// Get all children and for theses children go for children aswell (recursive)... 
getChildren(all, id) { 
    return all.reduce((tmp, x) => { 
    if (x.parent === id) { 
     return [ 
     ...tmp, 
     { 
      children: this.getChildren(all, x._id), 
      _id: x._id, 
      // ... 
     }, 
     ]; 
    } 

    return tmp; 
    }, []); 
} 

如果你想條目只能出現一次,在開始過濾條目得到只有頭(條目都沒有,父母)

dataFromDatabase.filter(x => !x.parent).map((x) => {