【问题标题】:Get the unique items - Handlebars获得独特的物品 - 车把
【发布时间】:2015-03-24 22:00:36
【问题描述】:

我的 JSON 如下所示:

{
  "features": [
    {
      "id": "belly",
      "scenarios": [
        {
          "id": "belly;a-few-cukes",
          "tags": [
            {
              "name": "@tag1"
            }
          ],
          "steps": [
            {
              "name": "I have 42 cukes in my belly"
            },
            {
              "name": "I wait 1 hour"
            },
            {
              "name": "my belly should growls"
            }
          ]
        },
        {
          "id": "belly;a-few-cukes-with-new-test",
          "tags": [
            {
              "name": "@tag2"
            }
          ],
          "steps": [
            {
              "name": "I have 42 cukes in my belly"
            },
            {
              "name": "I wait 1 hour"
            },
            {
              "name": "my belly should growl"
            }
          ]
        }
      ]
    },
    {
      "id": "newbelly",
      "scenarios": [
        {
          "id": "newbelly;a-few-cukes-with-new-feature",
          "tags": [
            {
              "name": "@tag1"
            }
          ],
          "steps": [
            {
              "name": "I have 42 cukes in my belly"
            },
            {
              "name": "I wait 1 hour"
            },
            {
              "name": "my belly should growls"
            }
          ]
        }
      ]
    }
  ]
}

我想检索所有唯一的标签名称:即@tag1、@tag2。如果您注意到,@tag1 会重复两次。

我的模板

{{#getTags features}}
    {{#scenarios}}
        {{#tags}}
            <p>{{name}}</p>
        {{/tags}}
    {{/scenarios}}
{{/getTags}}

自定义助手到目前为止我创建的:

Handlebars.registerHelper('getTags', function(context, block) {
    var ret = "";

    for (var i = 0; i < context.length; i++) {
        ret += block.fn(context[i]);
    };

    return ret;
});

上面的自定义助手返回所有标签,但我想要唯一的。

【问题讨论】:

    标签: javascript handlebars.js handlebarshelper


    【解决方案1】:

    类似的方法可能会奏效:

    Handlebars.registerHelper('getTags', function(context, block) {
    var ret = "";
    var got = [];
    
    function contains(obj, a) {
        for (var i = 0; i < a.length; i++) {
            if (a[i] === obj) {
                return true;
            }
        }
    return false;
    }
    
    for (var i = 0; i < context.length; i++) {
        if (!this.contains(context[i],got)) {
            got.addObject(context[i]);
            ret += block.fn(context[i]);
        }
    }
    
    return ret;
    });
    

    用于测试的代码,全部是javascript:

    var ret = "";
    var got = [];
    var data = ["tag1", "tag1", "tag2", "tag3"]
    
    function contains(obj, a) {
        for (var i = 0; i < a.length; i++) {
            if (a[i] === obj) {
                return true;
            }
        }
    return false;
    }
    
    for (var i = 0; i < data.length; i++) {
        if (!contains(data[i],got)) {
            got.push(data[i]);
            ret += data[i];
            }
    }
    
    console.log( ret);
    

    【讨论】:

    • 我在控制台中收到Uncaught TypeError: undefined is not a function 错误。
    • 我已经习惯了 Ember,所以有可能 Ember 函数溜进了我的代码!哪一行导致错误?
    • 如果你使用 jquery,将 .contains() 方法换成 $.inArray(context[i], got)
    • 我已经更新了上面的代码,以展示你可以手动完成它
    • 不过,ret 返回所有 3 个标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多