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

技术求助:合并两个Laptime JSON文件,去重SteamID并保留指定结构

解决圈速数据JSON文件合并问题(去重SteamID并保留指定结构)

看起来你之前用reduce . as $item ({}; . * $item)的问题在于,这个命令是直接合并顶层对象,会让第二个文件的loggedTimes完全覆盖第一个的,而不是递归合并里面的SteamID和车辆圈速数据。我给你写一个针对性的jq脚本,完美满足你的需求:合并两个文件的loggedTimes,去重SteamID,同时合并同一车辆下的所有圈速记录,完全保留你需要的结构。

最终JQ合并命令

jq -s '
  reduce .[] as $item (
    { loggedTimes: { steamids: {}, vehicles: {} } };
    # 合并SteamID,重复ID会被后处理的文件覆盖(可调整)
    .loggedTimes.steamids += $item.loggedTimes.steamids |
    # 递归合并车辆及对应的圈速记录
    .loggedTimes.vehicles |= reduce ($item.loggedTimes.vehicles | to_entries[]) as $vehicle (
      .;
      .[$vehicle.key] = (.[$vehicle.key] // {}) * $vehicle.value
    )
  )
' laptimes_data_ams.json laptimes_data_kow.json > merged_laptimes.json

命令详解

  1. -s选项:把两个输入文件读取成一个JSON数组,第一个元素是laptimes_data_ams.json的内容,第二个是laptimes_data_kow.json的内容。
  2. 外层reduce:遍历两个输入文件,初始化一个空的目标结构(包含空的steamids和vehicles)。
  3. SteamID合并:+=操作符会合并两个SteamID对象,如果存在重复的SteamID,后面文件中的名称会覆盖前面的。如果你想保留第一个文件的SteamID名称,把这行改成:
    .loggedTimes.steamids = $item.loggedTimes.steamids + .loggedTimes.steamids
    
    因为jq的+对对象是左优先,左边的键不会被右边的覆盖。
  4. 车辆及圈速合并:
    • 先把当前文件的vehicles转成键值对数组(to_entries[]),遍历每一辆车。
    • 对于每个车辆ID,如果目标结构中已经存在,就用*递归合并(这样同一车辆下的laptimes会合并,不会覆盖);如果不存在,就用// {}创建一个空对象再合并,确保不会出现null值。

测试示例

假设第一个文件内容:

{
  "loggedTimes": {
    "steamids": {
      "123": "Alice",
      "456": "Bob"
    },
    "vehicles": {
      "car001": {
        "laptimes": {
          "123": {
            "lapTime": 120.5,
            "logtime": "2024-01-01",
            "name": "Alice",
            "rank": 1,
            "refId": "ref1",
            "vehicleid": "car001",
            "wet": 0
          }
        }
      }
    }
  }
}

第二个文件内容:

{
  "loggedTimes": {
    "steamids": {
      "456": "Robert",
      "789": "Charlie"
    },
    "vehicles": {
      "car001": {
        "laptimes": {
          "456": {
            "lapTime": 118.2,
            "logtime": "2024-01-02",
            "name": "Robert",
            "rank": 1,
            "refId": "ref2",
            "vehicleid": "car001",
            "wet": 0
          }
        }
      },
      "car002": {
        "laptimes": {
          "789": {
            "lapTime": 130.1,
            "logtime": "2024-01-03",
            "name": "Charlie",
            "rank": 1,
            "refId": "ref3",
            "vehicleid": "car002",
            "wet": 0
          }
        }
      }
    }
  }
}

合并后的输出会完全符合你要的结构:

{
  "loggedTimes": {
    "steamids": {
      "123": "Alice",
      "456": "Robert",
      "789": "Charlie"
    },
    "vehicles": {
      "car001": {
        "laptimes": {
          "123": {
            "lapTime": 120.5,
            "logtime": "2024-01-01",
            "name": "Alice",
            "rank": 1,
            "refId": "ref1",
            "vehicleid": "car001",
            "wet": 0
          },
          "456": {
            "lapTime": 118.2,
            "logtime": "2024-01-02",
            "name": "Robert",
            "rank": 1,
            "refId": "ref2",
            "vehicleid": "car001",
            "wet": 0
          }
        }
      },
      "car002": {
        "laptimes": {
          "789": {
            "lapTime": 130.1,
            "logtime": "2024-01-03",
            "name": "Charlie",
            "rank": 1,
            "refId": "ref3",
            "vehicleid": "car002",
            "wet": 0
          }
        }
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者Shriukan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:48:39