how to get the path of an object's value from a value in javascript

前端 未结 3 761
清歌不尽
清歌不尽 2021-01-23 08:46

Example:

var someObject = {
\'part1\' : {
    \'name\': \'Part 1\',
    \'txt\': \'example\',
},
\'part2\' : {
    \'name\': \'Part 2\',
    \'size\': \'15\',
           


        
相关标签:
3条回答
  • 2021-01-23 08:46

    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, '.')

    0 讨论(0)
  • 2021-01-23 09:09

    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
    
    0 讨论(0)
  • 2021-01-23 09:09

    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.

    0 讨论(0)
提交回复
热议问题