Example:
var someObject = {
\'part1\' : {
\'name\': \'Part 1\',
\'txt\': \'example\',
},
\'part2\' : {
\'name\': \'Part 2\',
\'size\': \'15\',
If you try this on the window
object you'll end up in trouble as it is self referential. Quick and easy way to get around this is to a depth check:
function getPath(obj, val, path, depth) {
if (!depth) depth = 0;
if (depth > 50) return '';
path = path || "";
var fullpath = "";
for (var b in obj) {
if (obj[b] === val) {
return (path + "/" + b);
}
else if (typeof obj[b] === "object") {
fullpath = getPath(obj[b], val, path + "/" + b, depth++) || fullpath;
}
}
return fullpath;
}
This will return the same kind of path as above:
/part3/2/qty
To make that into an actual reference to variable simply regex:
'window' + '/part3/2/qty'.replace(/\/([0-9]+)\//g, '[$1].').replace(/\//g, '.')
Here's some code that should get you a path to your object, not sure how super safe it is:
function getPath(obj, val, path) {
path = path || "";
var fullpath = "";
for (var b in obj) {
if (obj[b] === val) {
return (path + "/" + b);
}
else if (typeof obj[b] === "object") {
fullpath = getPath(obj[b], val, path + "/" + b) || fullpath;
}
}
return fullpath;
}
Where testObj
is the object in your example:
console.log(getPath(testObj, '20')); // Prints: /part3/2/qty
console.log(getPath(testObj, "[value]")); // Prints: /part3/1/name
Try this:
http://jsfiddle.net/n8d2s/1/
The method returns an object, that contains the parts.
function getPath(obj, value, path){
path = path || [];
if(obj instanceof Array || obj instanceof Object){
//Search within children
for(var i in obj){
path.push(i); //push path, will be pop() if no found
var subPath = getPath(obj[i], value, path);
//We found nothing in children
if(subPath instanceof Array){
if(subPath.length == 1 && subPath[0]==i){
path.pop();
}
//We found something in children
}else if(subPath instanceof Object){
path = subPath;
break;
}
}
}else{
//Match ?
if(obj == value){
return {finalPath:path};
}else{
//not ->backtrack
path.pop();
return false;
}
}
return path;
}
Maybe its not the best code, took me 10min there but it should work.
To see any result, check your dev console F12.