javascript - 遍历 JSON 对象并生成路径和值
问题描述
我希望有人可以帮助我解决以下问题。
我想遍历一个深度嵌套的 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
方法遍历键/值对并使用递归生成键数组,但它不能很好地处理更深层次的兄弟姐妹......
我已经看过“使用 JavaScript 遍历 JSON 对象树的所有节点 ”,但它并没有解决我的问题,因为我想生成一个字典,其中遍历的路径是键,最深的节点是值。
我想强调一下,我正在寻找一个没有任何框架或库的原生 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);
});
解决方案
你可以通过创建一个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);
注意:当任何键组成时不起作用
[]
推荐阅读
- caffe - 使用 caffe 训练 RCF 模型的问题
- react-native - 将多个导航器嵌套在堆栈中还是切换导航器更好?
- r - 比较两个数据框并有条件地提取另一列的值
- tcl - 设置命令的使用
- django - 在 Django 中编辑动态选择字段
- javascript - Rails 6 - 在某些控制器操作中需要 JS 文件
- android - 你能帮我创建这个浮动操作按钮吗?
- python - 我正在尝试通过电子邮件将图像作为附件发送而不保存图像。我想直接发送变量
- python-3.x - .encode("utf-8") 似乎不支持我的表情符号?
- sql-server - 我想知道 SQL Server 上的分片方式