把手/胡子 - 是否有内置的方式来循环对象的属性?

Ben*_*Ben 206 javascript mustache handlebars.js

正如问题的标题所说,是否有胡子/把手循环对象属性的方式?

所以

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
}
Run Code Online (Sandbox Code Playgroud)

我可以在模板引擎中做一些相当于的事情

for(var prop in o)
{
    // with say, prop a variable in the template and value the property value
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 431

自Handlebars 1.0rc1以来内置支持

Handlebars.js中添加了对此功能的支持,因此不再需要外部帮助程序.

如何使用它

对于数组:

{{#each myArray}}
    Index: {{@index}} Value = {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

对象:

{{#each myObject}}
    Key: {{@key}} Value = {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

请注意,只会hasOwnProperty枚举通过测试的属性.

  • 这个答案肯定值得更多的赞成.谢谢! (5认同)
  • @Rafi:你不是指{{this.title}}吗? (3认同)
  • @Rafi:虽然不知道你的数据结构但是人们无法理解这一点. (2认同)
  • @qodeninja:简单:与上面示例中的值相同 - 使用`{{#each this}}`.您选择的术语也令人困惑(是什么使得一个对象成为"顶级"而另一个不是?什么是"预定义"键?等等),因此您可能想要重新审视这些概念. (2认同)
  • 您如何仅针对特定的白名单属性执行此操作? (2认同)

Ben*_*Ben 70

它实际上很容易实现为帮助:

Handlebars.registerHelper('eachProperty', function(context, options) {
    var ret = "";
    for(var prop in context)
    {
        ret = ret + options.fn({property:prop,value:context[prop]});
    }
    return ret;
});
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

{{#eachProperty object}}
    {{property}}: {{value}}<br/>
{{/eachProperty }}
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错,你需要在循环中添加一个hasOwnProperty检查,这样你就不会迭代原型属性了吗? (2认同)

小智 27

编辑:车把现在有一个内置的方式来实现这一点; 看到上面选择的答案.使用普通的胡子时,以下仍然适用.

Mustache可以遍历数组中的项目.所以我建议创建一个以Mustache可以使用的方式格式化的单独数据对象:

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };

for (var prop in o){
  if (o.hasOwnProperty(prop)){
    mustacheFormattedData['people'].push({
      'key' : prop,
      'value' : o[prop]
     });
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,您的Mustache模板将是这样的:

{{#people}}
  {{key}} : {{value}}
{{/people}}
Run Code Online (Sandbox Code Playgroud)

查看"非空列表"部分:https://github.com/janl/mustache.js


fly*_*ish 5

这是 @Ben 的答案,已更新以与 Ember 一起使用...请注意,您必须使用,Ember.get因为上下文是作为字符串传入的。

Ember.Handlebars.registerHelper('eachProperty', function(context, options) {
  var ret = "";
  var newContext = Ember.get(this, context);
  for(var prop in newContext)
  {
    if (newContext.hasOwnProperty(prop)) {
      ret = ret + options.fn({property:prop,value:newContext[prop]});
    }
  }
  return ret;
});
Run Code Online (Sandbox Code Playgroud)

模板:

{{#eachProperty object}}
  {{key}}: {{value}}<br/>
{{/eachProperty }}
Run Code Online (Sandbox Code Playgroud)