如何使用JavaScript调整JSON数据的嵌套结构
问题:调整JSON数据结构(从Moodle PHP查询到JS重构)
背景与需求
从Moodle数据库查询lbtb_eintraege表数据,当前PHP生成的JSON是单个对象数组(每个对象包含id、date、start等字段),需要重构为以日期为第一层键,ID为第二层键,其余数据作为ID对应的值的嵌套结构,示例结构:
{ "2024-05-05": { "1": { "start": "1", "description": "fdsfdsfd", "standort": "sz" } } }
现有代码问题
你之前尝试的JS循环逻辑错误:解析后的this.events是原始对象数组,而非按日期分组的对象,Object.keys(this.events)拿到的是数组索引(0、1、2...),不是日期,导致遍历逻辑完全不匹配需求。
解决方案
方案一:PHP端直接生成目标结构(推荐)
在查询后直接整理数据,避免JS端额外处理:
$lbtbs = $DB->get_records('lbtb_eintraege'); $groupedData = []; foreach ($lbtbs as $item) { $date = $item->date; $id = $item->id; // 移除id和date字段,保留其余数据 unset($item->id, $item->date); // 构建嵌套结构 if (!isset($groupedData[$date])) { $groupedData[$date] = []; } $groupedData[$date][$id] = $item; } $lbtb_json = json_encode($groupedData, JSON_PRETTY_PRINT);
方案二:JavaScript端重构数据
如果只能在JS端处理,遍历原始数组构建嵌套对象:
// 解析后的this.events是原始数组:[{id: '1', date: '2024-05-05', ...}, ...] const groupedEvents = {}; this.events.forEach(event => { // 解构分离id、date,剩余字段存入rest const { id, date, ...rest } = event; // 初始化日期对应的对象 if (!groupedEvents[date]) { groupedEvents[date] = {}; } // 按需求存入实例化的Event或原始数据 groupedEvents[date][id] = new Event(rest); }); // 替换为新结构 this.events = groupedEvents;
可搜索的关键词建议
- JavaScript 对象按字段分组
- PHP 数组嵌套分组处理
- JSON 结构转换 分组
- ES6 解构赋值与剩余参数
- Moodle DB get_records 数据整理
内容的提问来源于stack exchange,提问作者Sascha S
相关产品推荐
相关产品推荐

