如何遍历键名动态变化的JSON数据?无法使用固定键名取值
解决动态键名JSON的遍历取值问题
我明白你的痛点——每天JSON里的键名都在变,固定键名完全没法用,之前用索引取undefined肯定是踩了对象和数组混淆的坑。咱们一步步来解决:
问题出在哪?
看你的示例JSON,masterdetail里的每个child1/child2都是对象(比如{"name": "I AM", "age": "1"}),不是数组。你之前的代码里valor = obj[key]拿到的是这个对象,然后用valor[0]去取,对象根本没有数字索引,自然返回undefined啦!
修正后的遍历方案
我们可以用Object.entries()直接遍历对象的键值对,或者用Object.values()只拿值,完全不依赖固定键名。这里给你两种常用的写法:
1. 精准遍历每一层动态键(保留键名)
如果需要同时获取动态键名和对应的值,用Object.entries()最方便:
template: function(params) { // 直接获取masterdetail数组,不需要额外的JSON序列化(多此一举哦) const masterDetailList = params.data.masterdetail; masterDetailList.forEach(masterItem => { // 遍历masterItem里的所有子项(比如child1、child2) Object.keys(masterItem).forEach(childKey => { const childObject = masterItem[childKey]; // 遍历子对象的动态键值对——不管键名是name/age还是surname/id都能拿到 Object.entries(childObject).forEach(([dynamicKey, dynamicValue]) => { console.log(`动态键名: ${dynamicKey}, 对应值: ${dynamicValue}`); // 这里可以把值存到变量里,或者做你需要的处理 }); }); }); }
2. 直接提取所有动态值(忽略键名)
如果只关心值,不需要键名,用Object.values()更简洁:
template: function(params) { const masterDetailList = params.data.masterdetail; masterDetailList.forEach(masterItem => { Object.values(masterItem).forEach(childObject => { // 直接拿到子对象的所有值,返回数组 const allValues = Object.values(childObject); console.log('当前子对象的所有值:', allValues); }); }); }
进阶:处理更深的嵌套结构
如果未来JSON的嵌套层级也会变化,写个递归函数就能一网打尽所有动态值:
function getAllDynamicValues(target) { let result = []; // 先判断类型:数组/对象/基础值 if (Array.isArray(target)) { target.forEach(item => result = result.concat(getAllDynamicValues(item))); } else if (typeof target === 'object' && target !== null) { Object.values(target).forEach(value => { result = result.concat(getAllDynamicValues(value)); }); } else { // 基础值(字符串、数字等)直接加入结果 result.push(target); } return result; } // 使用方式:直接传入masterdetail数组 const allValues = getAllDynamicValues(params.data.masterdetail); console.log('所有层级的动态值:', allValues);
这样不管键名怎么变,嵌套有多深,都能轻松拿到所有数据啦!
内容的提问来源于stack exchange,提问作者EduBw
相关产品推荐
相关产品推荐

