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.