我希望有人可以在以下方面为我提供帮助。
我想遍历一个深层嵌套的JSON对象,并生成一个包含遍历的路径和相应值的字典。
我的对象看起来像这样:
{
title: 'Mr.',
user: {
address: {
city: 'Amsterdam'
},
name: {
first: 'MyFirstName',
last: 'MyLastName'
}
}
}
我追求的结果如下:
{
'title': 'Mr.',
'user.address.city': 'Amsterdam',
'user.name.first': 'MyFirstName',
'user.name.last': 'MyLastName'
}
我使用Object.Entries
方法遍历键/值对,并使用递归生成键数组,但是它不能很好地处理更深层次的兄弟姐妹...
我已经看过“ Traverse all the Nodes of a JSON Object Tree with JavaScript ”,但是它并不能解决我的问题,因为我想生成一个字典,其中遍历路径是键,而最深节点是值。
我想强调的是,我正在寻找没有任何框架或库的本机JavaScript解决方案。
当前结果是:
[
"user.address.city",
"user.name.first,name.last",
"user.occupation.job.description.name,description.title"
]
我的代码:
const obj = {
title: 'Mr.',
user: {
address: {
city: 'Amsterdam'
},
name: {
first: 'MyFirstName',
last: 'MyLastName'
}
}
};
const isObject = (obj) => Object.prototype.toString.call(obj).indexOf("Object") > -1;
const generateBindingKeys = (key, obj) => {
//return an array of keybindings, because there can be more siblings in one node
return Object.keys(obj).map(k => isObject(obj[k]) ? `${key}.${generateBindingKeys(k, obj[k])}` : `${key}.${k}`);
};
// traverse all entries in the new state
Object.entries(obj).forEach(([key, val]) => {
// generate the binding
// if there are children we need to recursively traverse through the path and return the keys
const bindings = isObject(val) ? generateBindingKeys(key, val) : key;
console.log(bindings);
});
答案 0 :(得分:1)
您可以通过创建recursive
函数来实现。检查以下代码段。
const object = {
title: 'Mr.',
user: {
address: {
city: 'Amsterdam',
},
name: {
first: 'MyFirstName',
last: 'MyLastName',
},
},
};
function getKeyNames(obj, lastStored, secondObj) {
Object.keys(obj).forEach((r) => {
const elem = obj[r];
const refObj = secondObj;
const key = lastStored ? `${lastStored}.${r}` : r;
if (!Array.isArray(elem)) {
if (typeof elem !== 'object') {
refObj[key] = elem;
}
}
if (typeof elem === 'object' && (!Array.isArray(elem))) {
getKeyNames(elem, key, secondObj);
}
});
return secondObj;
}
function getAllKeys(obj) {
const secondObj = {};
const keys = getKeyNames(obj, '', secondObj);
return keys;
}
const result = getAllKeys(object);
console.log(result);
注意:当任何键包含
时不起作用[]
答案 1 :(得分:0)
只需遍历并将值存储到这样的新对象中即可:
<script>
var jsond = {
title: 'Mr.',
user: {
address: {
city: 'Amsterdam'
},
name: {
first: 'MyFirstName',
last: 'MyLastName'
}
}
}
var newJson = {};
if(jsond.length!=0){
jQuery.each(jsond, function (i, val) {
if(typeof val==="object"){
jQuery.each(val, function (subi, subval) {
if(typeof subval==="object"){
jQuery.each(subval, function (verysubi, verysubval) {
newJson[verysubi] = verysubval;
});
}else{
newJson[subi] = subval;
}
});
}else{
newJson[i] = val;
}
});
}
console.log(newJson);
</script>
您也可以通过检查可能的值来分配user.address或任何其他键。