无法使用 Nunjucks for 循环获取数组中项目的索引

Cannot get index of item in array with Nunjucks for loop

我在从 Nunjucks {% for %} 循环获取数组中项目的索引时遇到一些问题。

我定位的数组很简单,看起来像这样

pages[1,2,3]

这是 Nunjucks 循环

{% for i,p in data.tickets.pages %}
  {{ i }} : {{ p }}
{% endfor %}

问题是

{{ p }} 输出 1,2,3{{ i }} 不输出任何内容。

如果有人能告诉我如何解决这个问题,我将不胜感激。

通常 nunjucks 等待 array 的单个迭代器。 当您使用多迭代器并传递 array 时,nunjucks 按迭代器集拆分每个 array 元素。

{% set pages = [[10, 11], [12, 13]] %}
{% for a, b in pages %}
{{a}},{{b}}
{% endfor %}
---
10:11
12:13

您可以使用range,将数组转换为对象(元素顺序可能会丢失)或使用loop.index0'/loop.index

var nunjucks  = require('nunjucks');
var env = nunjucks.configure();

// range
var res = nunjucks.renderString(`
    {% for i in range(0, items.length) %}
    {% set item = items[i] %}
    {{i}}: {{item}}
    {% endfor %}`, 
    {items: [10, 12]}
);

console.log(res);

// array to object
res = nunjucks.renderString(`
    {% for i, item in items %}
    {{i}}: {{item}}
    {% endfor %}`, 
    {items: Object.assign({}, [10, 12])}
);

console.log(res);

// loop.index0
res = nunjucks.renderString(`
    {% for item in items %}
    {{loop.index0}}: {{item}}
    {% endfor %}`, 
    {items: [10, 12]}
);

console.log(res);

要在 for 循环中获取索引,请使用 loop.index(loop.index 以 1 开头)
要获得标准行为(以 0 开头),请使用 loop.index0

data.tickets.pages = [1, 2, 3];

模板代码(loop.index)

{% for page in data.tickets.pages %}
  {{loop.index}}: {{ page }}
{% endfor %}

输出

1:1
2:2
3:3

模板代码(loop.index0)

{% for page in data.tickets.pages %}
  {{loop.index0}}: {{ page }}
{% endfor %}

输出

0:1
1:2
2:3

另见 nunjucks docs

  • loop.index:循环的当前迭代(1索引)
  • loop.index0:循环的当前迭代(0索引)
  • loop.revindex:直到结束的迭代次数(1个索引)
  • loop.revindex0:直到结束的迭代次数(基于0)
  • loop.first: boolean表示第一次迭代
  • loop.last: 表示最后一次迭代的布尔值
  • loop.length: 项目总数

对于通过 Google 或其他方式来到这里的任何人。我能够直接在我的模板中使用上述范围循环的方法,甚至嵌套循环。

这是我直接在 nunjucks 模板中的部分代码:

<ul class="index">
    {% for x in range(0, dbReport.sections.length) %}
        {% set section = dbReport.sections[x] %}
        <li>
            <strong>{{ x + 1 }}</strong> {{ section.sectionTitle }}
            <ul>
                <li>
                    <strong>{{ x + 1 }}.1</strong> Section components:
                    <ul>
                        {% for y in range(0, section.subSections.length) %}
                            {% set subSection = section.subSections[y] %}
                            <li>
                                <strong>{{ x + 1 }}.1.{{ y + 1 }}</strong> {{subSection.subSectionTitle}}
                            </li>
                        {% endfor %}
                    </ul>
                </li>
            </ul>
        </li>
    {% endfor %}
</ul>

array.entries()

{%- for pageIndex, page in collections.pages.entries() -%}
  <div class="page" id="page-{{ pageIndex + 1 }}">
    {{ page.templateContent | safe }}
  </div>
{%- endfor -%}