You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:50:00