技术问询:从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
相关产品推荐
相关产品推荐

