You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何从键名动态变化的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

火山引擎 最新活动