JavaScript中如何使用字符串作为JSON对象的选择器
从JSON对象中通过键路径提取数据的解决方案
我需要从名为results的JSON对象中提取大量数据,已经把所需的键路径存在myKeys对象里了。怎么用myKeys里的值作为results的选择器,获取像results.array1.array2.key、results.array1.anotherThing.key这类路径对应的数据?
用户提供的初始代码:
const myKeys = { key1: '.array1.array2.key', key2: '.array1.anotherThing.key', key3: '.array1.somethingElse.array2.key' } for (let [key, value] of Object.entries(myKeys)){ let data = {name: key, results: results[value]} }
问题分析
你当前的代码里results[value]无法正确获取值,因为value是带点的字符串(比如.array1.array2.key),对象的方括号语法只能直接访问单个键,不能解析带点的路径字符串。
解决方案
方法1:手动拆分路径遍历
把路径字符串拆成单个键名,然后一步步遍历对象获取对应值:
const myKeys = { key1: '.array1.array2.key', key2: '.array1.anotherThing.key', key3: '.array1.somethingElse.array2.key' }; const extractedData = []; for (let [alias, path] of Object.entries(myKeys)) { // 去掉路径开头的点,把字符串拆成键名数组 const keyList = path.slice(1).split('.'); let currentValue = results; // 逐个键名访问对象 for (const key of keyList) { // 中途遇到不存在的键或null,直接终止遍历 if (currentValue == null) break; currentValue = currentValue[key]; } extractedData.push({ name: alias, results: currentValue }); }
方法2:用reduce简化代码
利用数组的reduce方法,把路径遍历逻辑压缩成更简洁的写法,同时用可选链操作符避免报错:
const myKeys = { key1: '.array1.array2.key', key2: '.array1.anotherThing.key', key3: '.array1.somethingElse.array2.key' }; const extractedData = Object.entries(myKeys).map(([alias, path]) => { // 拆分路径并通过reduce逐层访问 const targetValue = path.slice(1).split('.').reduce((obj, key) => { return obj?.[key]; // 可选链:如果obj不存在直接返回undefined,不会报错 }, results); return { name: alias, results: targetValue }; });
注意事项
- 如果你的路径里包含数组索引(比如
.array1[0].key),上面的方法需要额外处理:可以先把[x]格式的索引拆分出来,再通过数组下标访问。 - 可选链操作符
?.需要运行环境支持ES2020及以上,如果是旧环境,替换成obj && obj[key]的条件判断即可。
内容的提问来源于stack exchange,提问作者Gerg
相关产品推荐
相关产品推荐

