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

技术问询:从JSON数组查唯一ID元素及FreeMarker按人员ID分组周

嘿,刚上手FreeMarker处理JSON数组确实容易踩坑,我来帮你搞定这两个需求!

需求一:从JSON数组中查找包含特定唯一ID的元素

首先假设你的JSON数据已经转成了FreeMarker能识别的序列(如果还是字符串,下面会附解析方式)。比如我们要找person_id为"1414"的员工记录,可以用?filter来筛选匹配的元素,代码示例如下:

<#-- 如果你的JSON还是字符串,先解析成序列 -->
<#assign jsonStr = '[{"Hours":"5.500","Status":"Draft","Week":"17","person_name":"Raj","person_id":"1414"}, {"Hours":"0.500","Status":"Draft","Week":"17","person_name":"Raj","person_id":"1414"}, {"Hours":"24.500","Status":"Draft","Week":"14","person_name":"Mukesh","person_id":"1046"}]'>
<#assign employeeHours = jsonStr?eval>

<#-- 筛选出所有匹配目标ID的记录 -->
<#assign targetRecords = employeeHours?filter(item -> item.person_id == "1414")>

<#if targetRecords?size > 0>
  <h4>找到ID为1414的员工记录:</h4>
  <ul>
    <#list targetRecords as record>
      <li>姓名:${record.person_name} | 周数:${record.Week} | 工时:${record.Hours} | 状态:${record.Status}</li>
    </#list>
  </ul>
<#else>
  <p>未找到对应ID的元素</p>
</#if>

如果只需要第一个匹配的元素,在targetRecords后面加?first就行,比如<#assign targetRecord = targetRecords?first>。

需求二:按人员ID(person_id)对周(Week)分组

FreeMarker自带的?group_by内置函数刚好能解决分组问题,它会把序列按指定属性分组,生成一个键为分组值、值为对应记录列表的哈希结构。结合?unique还能给每个员工的周数去重,代码如下:

<#-- 同样先确保JSON已解析为序列(如果是字符串的话) -->
<#assign jsonStr = '[{"Hours":"5.500","Status":"Draft","Week":"17","person_name":"Raj","person_id":"1414"}, {"Hours":"0.500","Status":"Draft","Week":"17","person_name":"Raj","person_id":"1414"}, {"Hours":"24.500","Status":"Draft","Week":"14","person_name":"Mukesh","person_id":"1046"}]'>
<#assign employeeHours = jsonStr?eval>

<#-- 按person_id分组 -->
<#assign groupedByPerson = employeeHours?group_by("person_id")>

<#list groupedByPerson as personId, records>
  <h3>员工信息:ID=${personId} | 姓名=${records[0].person_name}</h3>
  
  <h4>参与的周数(去重后):</h4>
  <#-- 提取所有Week并去重 -->
  <#assign uniqueWeeks = records?map(r -> r.Week)?unique>
  <ul>
    <#list uniqueWeeks as week>
      <li>第${week}周</li>
    </#list>
  </ul>

  <h4>所有工时记录:</h4>
  <table border="1" cellpadding="4">
    <tr>
      <th>周数</th>
      <th>工时</th>
      <th>状态</th>
    </tr>
    <#list records as record>
      <tr>
        <td>${record.Week}</td>
        <td>${record.Hours}</td>
        <td>${record.Status}</td>
      </tr>
    </#list>
  </table>
  <hr>
</#list>

这段代码会先把所有记录按person_id分组,然后对每个员工的记录提取周数并去重,最后展示该员工的所有工时明细。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:31