如何在Handlebars中将each块结果传入unique助手实现列值去重?
在Handlebars中获取数据列的唯一值
问题背景
你当前的Handlebars模板可遍历数据集并输出hostname.keyword的所有值,但结果包含重复项:
{{#each data}} {{this.hostname.keyword}} {{/each}}
你定义了一个去重助手,但无法正确传递参数实现需求:
handlebars.registerHelper("unique", (context) => [...new Set(context)]);
尝试将#each块作为参数传入助手时触发语法错误:
<div>{{unique ({{#each data}} {{this.hostname.keyword}} {{/each}})}}</div>
错误信息:
Parse error on line 2: .../h5><div>{{unique ({{#each data}} {{"ho ----------------------^ Expecting 'ID', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', got 'OPEN_BLOCK'
而直接传递data和字段名的写法无报错,但未返回任何结果:
<div>{{unique data "hostname.keyword"}}</div>
解决方案
1. 调整去重助手逻辑
原助手仅支持对单一数组去重,需要修改为先提取指定字段的所有值,再去重。更新后的助手可处理嵌套字段(如hostname.keyword):
handlebars.registerHelper("unique", (data, field) => { // 从数据集中提取所有指定字段的值 const fieldValues = data.map(item => { // 拆分嵌套字段路径,逐层获取值 return field.split('.').reduce((currentObj, key) => currentObj[key], item); }); // 去重后返回数组 return [...new Set(fieldValues)]; });
2. 模板中正确调用并遍历结果
使用Handlebars的子表达式调用助手,获取去重后的数组,再用#each遍历输出每个唯一值:
<div> {{#each (unique data "hostname.keyword")}} {{this}} {{/each}} </div>
逻辑说明
- 助手接收两个参数:数据集
data和字段路径"hostname.keyword"。 - 通过
split('.')拆分嵌套字段,reduce逐层访问对象属性,提取所有字段值。 - 利用
Set的唯一性去重,再转回数组返回。 - 模板中通过
(unique data "hostname.keyword")子表达式获取去重数组,最终用#each遍历输出。
内容的提问来源于stack exchange,提问作者gbs
相关产品推荐
相关产品推荐

