2016-07-23 7 views
1

Ich habe ein Objekt, das aus einem Menü besteht.Iterieren durch ein Objekt rekursiv Kind zu finden, Eltern, Großeltern etc. auf dem Weg zu sammeln

Ich möchte eine category ID eingeben und die category name bekommen, dann rückwärts gehen, um es zu finden ist parents. Das ist nicht einfach innerhalb eines Objekts, also denke ich, die parents auf dem Weg stattdessen zu fangen.

Das Problem, das ich habe, ist, wie reset die parents wenn das Ende Kind nicht gefunden wird und es gibt nirgendwo anders zu gehen.

Das ist, was ich versuche:

var data = [ 
 
\t { 
 
     "tree_id": "10", 
 
     "name": "babies & children", 
 
     "parent": null, 
 
     "position": "1" 
 
    }, { 
 
     "tree_id": "2", 
 
     "name": "clothing", 
 
     "parent": null, 
 
     "position": "1", 
 
     "children": [{ 
 
      "tree_id": "15", 
 
      "name": "kids", 
 
      "parent": "2", 
 
      "position": "3", 
 
      "children": [{ 
 
       "tree_id": "78", 
 
       "name": "fourToTen", 
 
       "parent": "15", 
 
       "position": "3", 
 
       "children": [{ 
 
        "tree_id": "102", 
 
        "name": "fourToSix", 
 
        "parent": "78", 
 
        "position": "3" 
 
       }] 
 
      }] 
 
     }] 
 
    }, { 
 
     "tree_id": "55", 
 
     "name": "toys", 
 
     "parent": null, 
 
     "position": "1", 
 
     "children": [{ 
 
      "tree_id": "35", 
 
      "name": "lego", 
 
      "parent": "55", 
 
      "position": "3" 
 
     }] 
 
    } 
 
]; 
 

 
var crumbs = []; 
 
function getParts(data, elem) { 
 
    for(var i = 0; i < data.length; i++) { 
 
     var obj = data[i]; 
 
     if(obj.children !== undefined){ 
 
      /* push parent into crumbs */ 
 
      crumbs.push(obj.name); 
 
     \t if(obj.children[0].tree_id === elem){ 
 
      \t /* if we've found what we're looking, we're done */ 
 
       crumbs.push(obj.children[0].name); 
 
       console.log(crumbs); 
 
      } else { 
 
      \t /* reset parents */ 
 
       crumbs = []; /* <-- this is wrong here */ 
 
       /* not found, keep recursing */ 
 
      \t getParts(obj.children, elem); 
 
      } 
 
     } 
 
    } 
 
} 
 
/* I want this to return 
 
[ 
 
    "clothing", 
 
    "kids", 
 
    "fourToTen", 
 
    "fourToSix" 
 
] 
 

 
but it returns 
 
[ 
 
    "fourToTen", 
 
    "fourToSix" 
 
] 
 
*/ 
 
getParts(data, '102');

Die Frage ist, wie kann ich die parents Array speichern, bis ich am Ende der Leitung und das Kind bin, ist, nicht gefunden, und dann zurücksetzen?

Here's a fiddle if that's your preferred playround

Antwort

3

Unter der Annahme, category id = tree_id und category_name = name

Sie müssen Ihr data Objekt wie ein Baum behandeln, es dann quer und die Eltern auf dem Weg zu verfolgen. Wenn etwas gefunden wird, dann lege die Informationen ab, die du brauchst.

Also data ist im Grunde eine Reihe von Objekten, die Sie transversieren werden.

Beispiel:

"use strict"; 
var data = [ 
    { 
     "tree_id": "10", 
     "name": "babies & children", 
     "parent": null, 
     "position": "1" 
    }, 
    { 
     "tree_id": "2", 
     "name": "clothing", 
     "parent": null, 
     "position": "1", 
     "children": [{ 
      "tree_id": "15", 
      "name": "kids", 
      "parent": "2", 
      "position": "3", 
      "children": [{ 
       "tree_id": "78", 
       "name": "fourToTen", 
       "parent": "15", 
       "position": "3", 
       "children": [{ 
        "tree_id": "102", 
        "name": "fourToSix", 
        "parent": "78", 
        "position": "3" 
       }] 
      }] 
     }] 
    }, 
    { 
     "tree_id": "55", 
     "name": "toys", 
     "parent": null, 
     "position": "1", 
     "children": [{ 
      "tree_id": "35", 
      "name": "lego", 
      "parent": "55", 
      "position": "3" 
     }] 
    } 
]; 

// Solution 
function transverse(root, tree, targetId) { 
    tree.push({ 
     catId : root.tree_id, 
     catName : root.name 
    }); 

    /* this if() must come first otherwise fails if you want to stop before end */ 
    if (root.tree_id === targetId) { 
     console.log("Found id:" + targetId+ ", name=" + root.name); 
     console.log("Dumping parent info => " + JSON.stringify(tree)); 
     return tree; 
    } 

    if (root.hasOwnProperty("children") && root.children instanceof Array) 
     root.children.forEach(child => { 
      transverse(child, tree, targetId); 
     }); 

} 

data.forEach(item => { 
    transverse(item, [], /*Looking for Id=*/"102"); 
}); 

console.log("done"); 

Ausgang:

Found id:102, name=fourToSix 
Dumping parent info => 
[ 
    {"catId":"2","catName":"clothing"}, 
    {"catId":"15","catName":"kids"}, 
    {"catId":"78","catName":"fourToTen"}, 
    {"catId":"102","catName":"fourToSix"}] 
] 
+0

Globals schlecht sind, versuchen Sie, Ihre Funktion umschreiben, so dass 'wantId' als Parameter übergeben wird. – georg

+0

Tatsächlich sind Globals schlecht. –

+0

Aktualisierte Antwort, hinterließ einen Kommentar –

Verwandte Themen