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

如何在Java中基于嵌套JSON字段对JSON数组进行降序排序

按嵌套日期字段对JSON数组进行降序排序

问题描述

我在排序JSON数组时遇到了问题,需要按照嵌套键 resource -> dosageInstruction -> timing -> repeat -> boundsPeriod -> start 对数组进行降序排序。以下是我的输入JSON数组:

[
  {
    "search": { "mode": "match" },
    "resource": {
      "prescriber": {},
      "identifier": [],
      "medicationReference": {},
      "dosageInstruction": [
        {
          "route": {},
          "method": {},
          "timing": {
            "repeat": {
              "period": 1,
              "periodUnits": "d",
              "boundsPeriod": { "start": "11/15/2016", "end": "11/23/2016" },
              "frequency": 1
            }
          },
          "doseQuantity": { "unit": "mg", "code": "mg", "system": "dasdsadasd", "value": 10 },
          "asNeededBoolean": false,
          "text": "Take 10 mg by mouth nightly."
        }
      ],
      "dispenseRequest": { "validityPeriod": { "start": "11/15/2016", "end": "11/23/2016" } },
      "patient": { "reference": "asdasdsada", "display": "Jason Argonaut" },
      "id": "T5YI1tCzs--JEvCICFbx8zgB",
      "dateWritten": "11/13/2016",
      "resourceType": "MedicationOrder",
      "status": "active"
    },
    "fullUrl": "asdsadasa",
    "link": [ { "url": "dassad", "relation": "self" } ]
  },
  {
    "search": { "mode": "match" },
    "resource": {
      "prescriber": { "reference": "dsfsd", "display": "Physician Cdr Inpatient, MD" },
      "identifier": [
        { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.2.798268", "use": "usual", "value": "971103" },
        { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.3.798268.801", "use": "usual", "value": "971103:2802249019" }
      ],
      "medicationReference": { "reference": "dfsdf", "display": "amphetamine-dextroamphetamine XR (ADDERALL XR) 15 MG 24 hr capsule" },
      "dosageInstruction": [
        {
          "route": { "coding": [ { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.698288.330", "code": "15", "display": "Oral" } ], "text": "Oral" },
          "method": { "coding": [ { "system": "urn:oid:1.2.840.114350.1.13.0.1.7.4.798268.8600", "code": "11", "display": "Take" } ], "text": "Take" },
          "timing": {
            "repeat": {
              "period": 1,
              "periodUnits": "d",
              "boundsPeriod": { "start": "11/07/2015", "end": "12/07/2015" },
              "frequency": 1
            }
          },
          "doseQuantity": { "unit": "capsule", "value": 1 },
          "asNeededBoolean": false,
          "text": "Take 1 capsule (15 mg total) by mouth every morning. Max Daily Amount: 15 mg"
        }
      ],
      "dispenseRequest": {
        "validityPeriod": { "start": "11/07/2015", "end": "12/07/2015" },
        "quantity": { "unit": "capsule", "value": 30 },
        "numberOfRepeatsAllowed": 0,
        "expectedSupplyDuration": { "unit": "days", "code": "d", "system": "urn:oid:2.16.840.1.113883.6.8", "value": 30 }
      },
      "patient": { "reference": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/Patient/Tbt3KuCY0B5PSrJvCu2j-PlK.aiHsu2xUjUM8bWpetXoB", "display": "Jason Argonaut" },
      "id": "TsmsDHh.ouMCg8QqhDaAMSAB",
      "dateWritten": "11/07/2015",
      "resourceType": "MedicationOrder",
      "status": "active"
    },
    "fullUrl": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/MedicationOrder/TsmsDHh.ouMCg8QqhDaAMSAB",
    "link": [ { "url": "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/MedicationOrder/TsmsDHh.ouMCg8QqhDaAMSAB", "relation": "self" } ]
  }
]

解决方案

要实现这个需求,我们可以使用JavaScript的 Array.sort() 方法,核心是将嵌套的日期字符串转换为可比较的 Date 对象,然后按降序排列。这里需要注意日期格式是 MM/DD/YYYY,直接传入 Date 构造函数即可正确解析。

另外,为了避免因某些元素缺失嵌套字段导致报错,我们可以添加简单的容错处理:

// 假设你的JSON数组已经解析为JavaScript对象数组,比如叫medicationOrders
const sortedMedicationOrders = [...medicationOrders].sort((a, b) => {
  // 获取元素的start日期,处理可能的字段缺失
  const getStartDate = (item) => {
    try {
      const startStr = item.resource.dosageInstruction[0].timing.repeat.boundsPeriod.start;
      return new Date(startStr);
    } catch (e) {
      // 如果字段缺失,返回一个极早的日期,确保这类元素排在末尾
      return new Date(0);
    }
  };

  const dateA = getStartDate(a);
  const dateB = getStartDate(b);

  // 降序排序:日期大的排在前面
  return dateB - dateA;
});

// 输出排序后的结果
console.log(JSON.stringify(sortedMedicationOrders, null, 2));

代码说明

  1. 解构数组:使用 [...medicationOrders] 创建原数组的副本,避免修改原数组。
  2. 日期提取函数:getStartDate 函数安全地提取嵌套的日期字段,通过 try/catch 处理字段缺失的情况,返回默认的极早日期。
  3. 排序逻辑:dateB - dateA 实现降序排序,因为 Date 对象相减会返回时间戳的差值,较大的日期时间戳更大,所以差值为正会让 b 排在 a 前面。

运行这段代码后,你的数组会按照 boundsPeriod.start 字段从最新到最旧的顺序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:16