使用handlebar.js,如何使用JSON文件中的值循环数据

使用handlebar.js,如何使用JSON文件中的值循环数据,json,handlebars.js,Json,Handlebars.js,这是JSON数组: { "profile": [ { "ID": 343, "gender": "female", "from": "Olivia" }, { "ID": 4543, "gender": "female", "from": "Meagen" }, { "ID": 787, "gender": "male",

这是JSON数组:

{
"profile": [
    {
        "ID": 343,
        "gender": "female",
        "from": "Olivia"
    },
    {
        "ID": 4543,
        "gender": "female",
        "from": "Meagen"
    },
    {
        "ID": 787,
        "gender": "male",
        "from": "Aaron"
    }
]
}
这会起作用,它会输出数组中的所有对象

{{#profile}}

{{from}} {{gender}}

{{/profile}}
输出将看起来像

Olivia female
Meagen female
Aaron male
Olivia female
Meagen female
但我的目标是只循环那些性别与女性平等的人。类似于

{{#profile gender="female"}}

{{from}} {{gender}}

{{/profile}}
…并使输出看起来像

Olivia female
Meagen female
Aaron male
Olivia female
Meagen female
几天来我一直在努力寻找答案。我是错过了什么还是偏离了正轨?

我看到两种选择:

  • 在将数据交给车把之前对其进行过滤
  • 使用自定义帮助器处理模板内的逻辑
  • 第一个很直接

    第二个取决于你想怎么做。您可以添加“如果相等”辅助对象:

    并在模板中执行此操作:

    {{#profile}}
        {{#if_eq gender "female"}}
            {{from}} {{gender}}
        {{/if_eq}}
    {{/profile}}
    
    演示:

    或者,您可以用多种方式编写自己的迭代器:

    Handlebars.registerHelper('each_female', function(list, opts) {
        var i, result = '';
        for(i = 0; i < list.length; ++i)
            if(list[i].gender == 'female')
                result = result + opts.fn(list[i]);
        return result;
    });
    
    {{#each_female profile}}
        {{from}} {{gender}}
    {{/each_female}}
    
    handlebar.registerHelper(“每个女性”),功能(列表,选项){
    var i,结果=“”;
    对于(i=0;i
    或者更一般一点:

    Handlebars.registerHelper('each_when', function(list, k, v, opts) {
        console.log(arguments);
        var i, result = '';
        for(i = 0; i < list.length; ++i)
            if(list[i][k] == v)
                result = result + opts.fn(list[i]);
        return result;
    });
    
    {{#each_when profile "gender" "female"}}
        {{from}} {{gender}}
    {{/each_when}}
    
    handlebar.registerHelper('each_when',函数(列表、k、v、选项){
    log(参数);
    var i,结果=“”;
    对于(i=0;i
    演示:


    如果您想要更接近您建议的语法,请参阅关于散列参数的说明。

    由于一些无法解释的原因,我无法了解eq是否在我正在处理的项目中工作。但每一次都是成功的。谢谢是否可以在结果中添加
    条件?比如我想检查两个条件是否为真?@SHT:当然,为什么不可能呢?在模板中可能有点麻烦,但您可以这样做。
    每一个when
    都非常有用,但不包括
    @last
    @first
    ,我需要在其中添加
    if
    。知道如何实现吗?@Jakub已经有一段时间没有使用把手了,而且文档也很薄,所以我不知道。也许从源代码开始,找出它是如何工作的。