如果长度未知,则把手返回具有特定索引的数组元素

时间:2017-10-23 20:15:15

标签: javascript arrays node.js handlebars.js express-handlebars

使用Handlebars和Node,我有一个长度不断变化的数组,每次更改时我总是需要在它的最后一个元素之前得到它。

因此,如果你想获得最后一个元素,你可以这样做:

{{#each array}}
  {{#if @last}}
    {{this}}
  {{/if}}
{{/each}}

它将返回最后一个元素。 我有Math助手,可以执行基本的数学运算。 例如,我可以得到所需的索引号

{{math array.length '-' 1}}

但我不能将它与另一个块助手一起使用,例如:

{{#each array}}
  {{#if math @last '-' 1}}
    {{this}}
  {{/if}}
{{/each}}

怎么可以这样做?谢谢。

2 个答案:

答案 0 :(得分:2)

首先,您声明不能在math块助手的胡须中使用#if助手,例如{{#if math @last '-' 1}}。这不是真的。把手支持subexpressions

  

Handlebars提供对子表达式的支持,它允许您在一个小胡子中调用多个帮助程序,并将内部帮助程序调用的结果作为参数传递给外部帮助程序。 Subexpressions由括号分隔。

然而,{{#if (math @last '-' 1)}}没有多大意义,因为@last是布尔值,我建议不要从1true中减去false的奇怪之处

如果您的问题是从阵列中渲染单个元素 - 例如,倒数第二个 - 那么我不明白为什么您#each通过array。您所需要做的就是将内置的lookup helper与现有的math帮助器结合起来,您的模板变得更加简单:

{{lookup array (math array.length '-' 2)}}

注意:请记住,JavaScript数组是零索引的,因此我们需要减去2以从最后一个元素中获取第二个。

我创建了一个简单的fiddle供参考。

答案 1 :(得分:1)

您可以为此注册自己的帮助:

Handlebars.registerHelper('isSecondLastArrayItem', function(array, index, options) {

  if((array.length - 2) === index)
    return options.fn(this);

  return;

});

并像这样使用它:

{{#each array}}
  {{#isSecondLastArrayItem @root.array @index}}
    {{title}}
  {{/isSecondLastArrayItem}}
{{/each}}

示例数据:

{ 
  array: [{ title: 'aa' }, { title: 'vv' }]
}

sandbox中尝试。

编辑:任何索引的案例

Handlebars.registerHelper('isNthLastArrayItem', function(array, index, offset, options) {

  if(((array.length >= offset) && (array.length - offset) === index)
    return options.fn(this);

  return;

});

用法(来自最后的2nd项目):

{{#each array}}
  {{#isNthLastArrayItem @root.array @index 2}}
    {{title}}
  {{/isNthLastArrayItem}}
{{/each}}