简体   繁体   中英

how to find specific object form tree recursively

I want to find single json objec based on ID, from below tree. example - getObjeById(4) ,

it should return obj from below tree. need help on this.

data={
  "mytree": {
    "id": "dectree",
    "dt": {
      "choice": {
        "id": 0,
        "title": "Which color",
        "description": "Choose color ?",
        "choice": [
          {
            "id": 1,
            "title": "Yellow",
            "description": "Yellow ? ",

            "choice": [
              {
                "id": 5,
                "title": "Dark Yellow",
                "description": "Dark Yellow ,
                "choice": [
                  {
                    "id": 6,
                    "title": "id 6 yello",
                    "description": "<span> last leaf for yello </span>"
                  }]
              },
              {
                "id": 4,
                "title": "Light Yellow",
                "description": "Light Yellow 
              }
            ]
          },
          {
            "id": 2,
            "title": "Red",
            "description": "Red ?"
          },
          {
            "id": 3,
            "title": "Green",
            "description": "Green 
          },
          {
            "id": 7,
            "title": "white",
            "description": "white color",
             "choice": [
                  {
                    "id": 8,
                    "title": "id 8 white",
                    "description": "<span> last leaf for white </span>"
                  }]
          }
        ]
      }
    }
  }
}

Below is a snippet showcasing a recursive search function.

As warned, this function takes approximately 6 milliseconds to search this tree, about a third of a standard 60 fps frame.

 var data = { "mytree": { "id": "dectree", "dt": { "choice": { "id": 0, "title": "Which color", "description": "Choose color ?", "choice": [{ "id": 1, "title": "Yellow", "description": "Yellow ? ", "choice": [{ "id": 5, "title": "Dark Yellow", "description": "Dark Yellow", "choice": [{ "id": 6, "title": "id 6 yello", "description": "<span> last leaf for yello </span>" }] }, { "id": 4, "title": "Light Yellow", "description": "Light Yellow" }] }, { "id": 2, "title": "Red", "description": "Red ?" }, { "id": 3, "title": "Green", "description": "Green" }, { "id": 7, "title": "white", "description": "white color", "choice": [{ "id": 8, "title": "id 8 white", "description": "<span> last leaf for white </span>" }] }] } } } }; //Here comes the recursive function function searchTree(data, idLabel, idValue, results) { if (idLabel === void 0) { idLabel = "id"; } if (idValue === void 0) { idValue = "0"; } if (results === void 0) { results = []; } var keys = Object.keys(data); keys.forEach(function search(key) { if (typeof data[key] == "object") { results = searchTree(data[key], idLabel, idValue, results); } else { if (data[key] == idValue && key == idLabel) { results.push(data); } } }); return results; } console.log("Looking for 4:", searchTree(data, "id", "4")); console.log("Looking for 6:", searchTree(data, "id", "6")); 

EDIT - flat structure

An ideal structure would properly look more like this:

 var data = [{ id: 1, title: "Yellow", description: "Yellow ? ", choices: [4, 5] }, { id: 2, title: "Red", description: "Red ?", choices: [] }, { id: 3, title: "Green", description: "Green", choices: [] }, { id: 4, title: "Light Yellow", description: "Light Yellow", choices: [] }, { id: 5, title: "Dark Yellow", description: "Dark Yellow", choices: [6] }, { id: 6, title: "id 6 yello", description: "<span> last leaf for yello </span>", choices: [] }, { id: 7, title: "white", description: "white color", choices: [8] }, { id: 8, title: "id 8 white", description: "<span> last leaf for white </span>", choices: [] }]; console.log("Get elements with id == 7", data.filter(function(i) { return i.id === 7 })[0]); console.log("Get elements with id == 2", data.filter(function(i) { return i.id === 1 })[0]); console.log("Get elements with id == 3 or id == 4", data.filter(function(i) { return i.id === 3 || i.id === 4 })); 

With a structure like above, traversing the tree using filter becomes trivial. Approximately 2 milliseconds calculation time on this structure and it should scale much better.

From here, we could also easily sort our list or manipulate it in a bunch of ways using optimized, native functionality.

is there any way to find immeida parent form node ? I am geeting specific now example id : 5 and it maye be part of one parent whcih is id:3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM