如何用JSLT实现姓名聚合日期身高数据及扩展可行性?
JSLT分组聚合解决方案
1. 用JSLT实现分组聚合的正确写法
你之前的模板因为循环中同名key会被覆盖,所以只保留了每组最后一条数据。要实现按name分组并保留所有date-height键值对,结合JSLT内置的group-by和merge函数就能解决:
{ for (group-by(., .name) as $group) $group.key: merge(for ($group.items) {.date: .height}) }
逻辑说明:
group-by(., .name):将原始数组按name字段分组,得到包含key(分组的name值)和items(该分组下的所有原始对象)的分组集合。- 遍历每个分组时,先用
for ($group.items) {.date: .height}把分组内的每个对象转成{date: height}的小对象,再用merge函数把这些小对象合并成一个大对象,这样同name下的所有date-height键值对都会被保留(如果存在重复date,merge会保留最后出现的那条数据)。
2. 已引入JSLT的代码库中是否需要扩展?
完全不需要额外扩展,直接用上述模板就能解决问题。JSLT内置的group-by和merge函数已经覆盖了这个需求的所有逻辑,直接替换你原来的模板即可。
如果你的代码库有复用这类分组逻辑的需求,也可以封装自定义函数。比如在Java集成JSLT的场景下,你可以注册一个自定义函数,把分组聚合的逻辑封装进去,之后在模板里直接调用这个函数就行,但这属于优化场景,不是必须的。
内容的提问来源于stack exchange,提问作者Joseph Hales
相关产品推荐
相关产品推荐

