如何从键名动态变化的JSON生成JavaScript变量?
如何动态解析键名不固定的JSON对象到JavaScript变量
没问题,我来给你梳理一下怎么处理这种键名不固定的JSON解析需求。核心思路就是不依赖固定键名,而是动态遍历对象的所有键值对,不管键名改成什么都能适配。
第一步:把JSON字符串转成JavaScript对象(如果是字符串的话)
如果你的JSON是字符串格式,首先用JSON.parse()把它转成JS可操作的对象:
// 假设这是你的JSON字符串 const jsonStr = `{ "3":[{ "materialid":3, "title":"New Titlted Stuff", "description":"Description of Stuff", "datecreated":"05/09/2018", "keywords":"Keywords about stuff", "material":"7_html_logo.png" }], "4":[{ "materialid":4, "title":"ABC title", "description":"ABC desc", "datecreated":"05/23/2018", "keywords":"ABC Keywords", "material":"8_angular_logo.png" }], "5":[{ "materialid":5, "title":"4th try", "description":"describe 4th thing", "datecreated":"05/14/2018", "keywords":"4th thing keywords", "material":null }] }`; // 解析成JS对象 const materialsData = JSON.parse(jsonStr);
如果你的JSON已经是JS对象(比如直接从接口返回的就是对象),那这一步可以跳过。
第二步:动态遍历所有键值对
因为外层是数字键的对象,每个键对应一个物料数组,数组里的每个对象键名又不固定,所以我们需要多层遍历,用Object.keys()或Object.entries()来动态获取键和值:
示例1:打印所有键名和对应值
// 遍历外层的数字键("3"、"4"、"5") for (const outerKey of Object.keys(materialsData)) { const materialList = materialsData[outerKey]; // 遍历每个数组里的物料对象 materialList.forEach(material => { // 用Object.entries()把物料对象转成键值对数组,动态遍历 for (const [propName, propValue] of Object.entries(material)) { console.log(`当前键名: ${propName}, 对应值: ${propValue}`); // 这里可以根据需求做任何操作,比如存储到变量、判断值类型等 } }); }
示例2:收集所有物料到统一数组
如果需要把所有物料整理成一个数组,不管键名是什么都能完整保留:
const allMaterials = []; for (const key of Object.keys(materialsData)) { materialsData[key].forEach(item => { const dynamicItem = {}; // 动态遍历每个物料的键值对,赋值到新对象 for (const [k, v] of Object.entries(item)) { dynamicItem[k] = v; } allMaterials.push(dynamicItem); }); } // 现在allMaterials里就是所有物料对象,键名不管怎么变都能正确存储 console.log(allMaterials);
关键知识点
Object.entries(obj):把对象转换成[[键名1, 值1], [键名2, 值2]]格式的数组,完美适配动态键名的遍历需求。for...of循环:比传统的for...in更安全,不会遍历到对象原型链上的属性。
这样不管materialid改成othernameid,还是title改成somethingelsetitle,代码都能正常获取到每个键名和对应的值,完全不需要修改逻辑。
内容的提问来源于stack exchange,提问作者King Jeremy The Wicked




