Javascript reflection: Get nested objects path

前端 未结 3 618
感情败类
感情败类 2021-01-03 02:35

In this stackoverflow thread, i learnt you can get a object path via a simple string.

Accessing nested JavaScript objects with string key

consider the follow

相关标签:
3条回答
  • 2021-01-03 03:24

    This is what worked for me. Note that, a raw map is created first and then mapped to an join the items in the Array with ..

    var toIterate = {
      name: "somename",
      personal: {
        age: "19",
        color: "dark"
      }
    };
    
    console.log(getObjPath(toIterate).map(item => item.join('.')));
    
    function isObject(x) {
      return Object.prototype.toString.call(x) === '[object Object]';
    };
    
    function getObjPath(obj, pathArray, busArray) {
      pathArray = pathArray ? pathArray : [];
      if (isObject(obj)) {
        for (key in obj) {
          if (obj.hasOwnProperty(key)) {
            if (isObject(obj[key])) {
              busArray = busArray ? bussArray : [];
              busArray.push(key);
              getObjPath(obj[key], pathArray, busArray);
            } else {
              if (busArray) {
                pathArray.push(busArray.concat([key]));
              } else {
                pathArray.push([key]);
              }
            }
          }
        }
      }
      return pathArray;
    }

    Good Luck...

    0 讨论(0)
  • 2021-01-03 03:27

    Just use recursion to walk the object.

    var person = {
        name: "somename",
        personal: {
            weight: "150",
            color: "dark",
            foo: {
                bar: 'bar',
                baz: 'baz'
            },
            empty: {
            }
        }
    };
    
    // however you want to do this
    var isobject = function(x){
        return Object.prototype.toString.call(x) === '[object Object]';
    };
    
    var getkeys = function(obj, prefix){
        var keys = Object.keys(obj);
        prefix = prefix ? prefix + '.' : '';
        return keys.reduce(function(result, key){
            if(isobject(obj[key])){
                result = result.concat(getkeys(obj[key], prefix + key));
            }else{
                result.push(prefix + key);
            }
            return result;
        }, []);
    };
    
    var keys = getkeys(person);
    
    document.body.innerHTML = '<pre>' + JSON.stringify(keys) + '</pre>';

    Then use Array.prototype.map to massage the array of keys into your preferred format. Note the behaviour with person.personal.empty.

    This does seem like a strange way to store an object's keys. I wonder what your 'further use for it down the road' is.

    0 讨论(0)
  • 2021-01-03 03:29

    I found the following solution on github.

    https://github.com/mariocasciaro/object-path

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