Javascript 反射:获取嵌套对象路径

Javascript reflection: Get nested objects path

在这个 Whosebug 线程中,我了解到您可以通过一个简单的字符串获取对象路径。

Accessing nested JavaScript objects with string key

考虑以下因素:

var person = { name: "somename", personal: { weight: "150", color: "dark" }};

var personWeight = deep_value(person,"personal.weight");

我试图从我的 'person' 对象构造一个不属于 'object' 类型的对象值数组。

因此数组看起来像:

[['name', []],['personal.weight', []],['personal.color', []]];

我想让他们看那个表格,因为我以后还会用到它。

这就是我试过的方法:

var toIterate = { name: "somename", personal: { age: "19", color: "dark" } }

var myArray = [];

$.each(toIterate, recursive);

function recursive(key, value) {         

    if (key !== null) {
        myArray.push([key, []]);
    }
    else {
        $.each(value, recursive);
    }
}

console.log(myArray);

只需使用递归遍历对象即可。

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>';

然后使用 Array.prototype.map 将键数组修改为您喜欢的格式。 注意 person.personal.empty.

的行为

这似乎是一种存储对象键的奇怪方式。我想知道你的 'further use for it down the road' 是什么。

我在 github 上找到了以下解决方案。

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

这对我有用。请注意,首先创建 raw 映射,然后 mappedjoin Array 中的 items..

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;
}

祝你好运...