如何将指定JavaScript字符串数组转换为目标JSON对象
解决JavaScript数组转目标JSON结构的方案
嘿,这个转换需求很清晰,我们可以通过遍历原数组,逐步构建目标对象来实现。下面是具体的思路和代码实现:
实现思路
- 先初始化最终结果容器(一个包含单个对象的数组),以及用于临时存储当前客人信息的变量;
- 遍历原数组的每一项:
- 若当前项包含
=,说明是键值对,分割并处理掉前后空格后,判断是全局属性(Id、time、Topic)还是客人的子属性(Role、Infos),分别添加到对应位置; - 若当前项是
GUEST开头的字符串,说明是新的客人节点,先把之前的客人信息(如果存在)挂载到主对象,再初始化新的客人键和子对象;
- 若当前项包含
- 遍历结束后,记得把最后一个客人的信息也挂载到主对象,确保没有遗漏。
代码实现
const data = [ "Id = 2", "time = 10:59", "Topic = xxxxxxxxxxxxxxxx", "GUEST3", "Role = GS", "Infos = Connecticut", "GUEST4", "Role = HS", "Infos = Delaware", "GUEST5", "Role = CS", "Infos = Hawaii" ]; // 初始化结果数组和主对象 const result = [{}]; const mainObj = result[0]; let currentGuestKey = null; let currentGuestObj = null; data.forEach(item => { if (item.includes('=')) { // 处理键值对,分割并去除前后空格 const [key, value] = item.split('=').map(str => str.trim()); // 判断是全局属性还是客人的子属性 if (['Id', 'time', 'Topic'].includes(key)) { // 全局属性直接加到主对象,Id转成数字类型 mainObj[key] = key === 'Id' ? Number(value) : value; } else if (currentGuestKey && currentGuestObj) { // 客人的子属性加到当前客人对象 currentGuestObj[key] = value; } } else if (item.startsWith('GUEST')) { // 如果之前有未完成的客人对象,先加到主对象 if (currentGuestKey && currentGuestObj) { mainObj[currentGuestKey] = currentGuestObj; } // 初始化新的客人键和对象 currentGuestKey = item; currentGuestObj = {}; } }); // 处理最后一个客人对象 if (currentGuestKey && currentGuestObj) { mainObj[currentGuestKey] = currentGuestObj; } console.log(JSON.stringify(result, null, 2));
输出结果
运行上面的代码后,你会得到完全符合需求的结构:
[ { "Id": 2, "time": "10:59", "Topic": "xxxxxxxxxxxxxxxx", "GUEST3": { "Role": "GS", "Infos": "Connecticut" }, "GUEST4": { "Role": "HS", "Infos": "Delaware" }, "GUEST5": { "Role": "CS", "Infos": "Hawaii" } } ]
这里需要注意的点:
- 我们把
Id转换成了数字类型,如果你需要它保持字符串,去掉Number(value)即可; - 代码里通过
startsWith('GUEST')判断客人节点,即使后面的数字变化也能兼容; - 遍历结束后一定要处理最后一个客人对象,否则会遗漏。
内容的提问来源于stack exchange,提问作者mamesaye
相关产品推荐
相关产品推荐

