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 上找到了以下解决方案。
这对我有用。请注意,首先创建 raw
映射,然后 mapped
到 join
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;
}
祝你好运...
在这个 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 上找到了以下解决方案。
这对我有用。请注意,首先创建 raw
映射,然后 mapped
到 join
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;
}
祝你好运...