2014-09-19 14 views
6

Sto provando a memorizzare un albero di directory in un mongoDB. Ecco il mio schema:Costruire albero javascript basato sull'attributo padre nella serie di elementi

{ "_id" : ObjectId("541ba7f156d876d3f787bc33"), "name" : "file_1.mp3", "length" : 136.6, "kind" : "audio", "parent" : null } 
{ "_id" : ObjectId("541ba7f156d876d3f787bc34"), "name" : "file_2.mp3", "length" : 132.0, "kind" : "audio", "parent" : null } 
{ "_id" : ObjectId("541ba7f156d876d3f787bc35"), "name" : "file_3.mp3", "length" : 116.8, "kind" : "audio", "parent" : null } 
{ "_id" : ObjectId("541ba7f156d876d3f787bc36"), "name" : "file_4.mp3", "length" : 206.7, "kind" : "audio", "parent" : null } 
{ "_id" : ObjectId("541ba84456d876d3f787bc37"), "name" : "folder_1", "length" : null, "kind" : "dir", "parent" : null } 
{ "_id" : ObjectId("541ba84456d876d3f787bc38"), "name" : "folder_2", "length" : null, "kind" : "dir", "parent" : null } 
{ "_id" : ObjectId("541ba84456d876d3f787bc39"), "name" : "folder_3", "length" : null, "kind" : "dir", "parent" : null } 
{ "_id" : ObjectId("541ba91656d876d3f787bc3a"), "name" : "subfolder_1", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") } 
{ "_id" : ObjectId("541ba91656d876d3f787bc3b"), "name" : "subfolder_2", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") } 
{ "_id" : ObjectId("541ba91656d876d3f787bc3c"), "name" : "subfolder_3", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") } 
{ "_id" : ObjectId("541ba98056d876d3f787bc3d"), "name" : "subsubfolder_1", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") } 
{ "_id" : ObjectId("541ba98056d876d3f787bc3e"), "name" : "subsubfolder_2", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") } 
{ "_id" : ObjectId("541ba98056d876d3f787bc3f"), "name" : "subsubfolder_3", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") } 

voglio cambiamenti questo in modo che i bambini ricevono poste all'interno delle genitori. vale a dire:

[ 
    { 
    "_id" : ObjectId("541ba7f156d876d3f787bc33"), 
    "name" : "file_1.mp3", 
    "length" : 136.6, 
    "kind" : "audio", 
    "parent" : null 
    } 
    { 
    "_id" : ObjectId("541ba7f156d876d3f787bc34"), 
    "name" : "file_2.mp3", 
    "length" : 136.6, 
    "kind" : "audio", 
    "parent" : null 
    } 
    { 
    "_id" : ObjectId("541ba7f156d876d3f787bc35"), 
    "name" : "file_3.mp3", 
    "length" : 136.6, 
    "kind" : "audio", 
    "parent" : null 
    } 
    { 
    "_id" : ObjectId("541ba7f156d876d3f787bc36"), 
    "name" : "file_4.mp3", 
    "length" : 136.6, 
    "kind" : "audio", 
    "parent" : null 
    } 
    { 
    "_id" : ObjectId("541ba84456d876d3f787bc37"), 
    "name" : "folder_1", 
    "length" : null, 
    "kind" : "dir", 
    "parent" : null 
    "children": [ 
     { 
     "_id" : ObjectId("541ba91656d876d3f787bc3a"), 
     "name" : "subfolder_1", 
     "length" : null, 
     "kind" : "dir", 
     "parent" : ObjectId("541ba84456d876d3f787bc37") 
     }, 
     { 
     "_id" : ObjectId("541ba91656d876d3f787bc3b"), 
     "name" : "subfolder_2", 
     "length" : null, 
     "kind" : "dir", 
     "parent" : ObjectId("541ba84456d876d3f787bc37") 
     "children": [ 
      { 
      "_id" : ObjectId("54198056d876d3f787bc3d"), 
      "name" : "subsubfolder_1", 
      "length" : null, 
      "kind" : "dir", 
      "parent" : ObjectId("541ba91656d876d3f787bc3b") 
      } 
      { 
      "_id" : ObjectId("541ba98056d876d3f787bc3e"), 
      "name" : "subsubfolder_2", 
      "length" : null, 
      "kind" : "dir", 
      "parent" : ObjectId("541ba91656d876d3f787bc3b") 
      } 
      { 
      "_id" : ObjectId("541ba98056d876d3f787bc3f"), 
      "name" : "subsubfolder_3", 
      "length" : null, 
      "kind" : "dir", 
      "parent" : ObjectId("541ba91656d876d3f787bc3b") 
      } 
     ] 
     }, 
     { 
     "_id" : ObjectId("541ba91656d876d3f787bc3c"), 
     "name" : "subfolder_3", 
     "length" : null, 
     "kind" : "dir", 
     "parent" : ObjectId("541ba84456d876d3f787bc37") 
     } 
    ] 
    } 
    { 
    "_id" : ObjectId("541ba84456d876d3f787bc38"), 
    "name" : "folder_2", 
    "length" : null, 
    "kind" : "dir", 
    "parent" : null 
    } 
    { 
    "_id" : ObjectId("541ba84456d876d3f787bc39"), 
    "name" : "folder_3", 
    "length" : null, 
    "kind" : "dir", 
    "parent" : null 
    } 

Ecco la funzione che sto usando per cercare di raggiungere questo obiettivo:

getChildren = function(element) { 
    // find all the entries that have this element as their parent 
    var results = FileTree.find({'parent': element._id}); 

    // did we find any children? 
    if (results.count() !== 0) { 
    // get an array from the mongo cursor 
    var rArr = results.fetch(); 
    // attach a '.children' object to each of the children 
    // so that we continue the tree 
    var children = _.each(rArr, getChildren); 
    //make this subtree part of the original element 
    element.children = children; 
    return element; 
    } 
    else { // the element doesn't have any children 
    element.children = null; 
    return element; 
    } 
}; 

chiamo la funzione in questo modo:

id = new Meteor.Collection.ObjectID("541ba84456d876d3f787bc37"); 
getChildren(FileTree.findOne({'_id': id})); 

mia console restituisce questo:

Object { _id: Object, name: "folder_1", length: null, kind: "dir", parent: null, children: undefined } 

Perché i bambini sono indefiniti Ed?

Ecco una demo live: http://meteorpad.com/pad/imyw4w7z7dihss9t3

+0

Si potrebbe considerare di inserire le parentesi di chiusura implicite nella formattazione. Anche se è solo qualcosa come "...}". Aiuta con copia/incolla del codice in modo che possiamo dargli una corsa. Ad ogni modo, sicuramente +1 in più degno. – ouflak

risposta

2

Si desidera utilizzare _.map invece di _.each, vedere here.

_.map restituisce l'array con i risultati della funzione di iterazione, che è ciò che si desidera assegnare al parametro children. _.each passa semplicemente alla raccolta, restituendo undefined.

Problemi correlati