nunjucks 设置创建对象

Jon*_*tom 2 javascript nunjucks

由于 nunjucks 现在支持使用set 作为块,我想做这样的事情:

{% set navigationItems %}
  {% for item in items %}
    { name: item.name, url: item.url }{% if not loop.last %},{% endif %}
  {% endif %}
{% endset %}
Run Code Online (Sandbox Code Playgroud)

然后调用这个变量作为另一个宏的输入对象,如下所示:

{{ navigation(items=[navigationItems]) }}
Run Code Online (Sandbox Code Playgroud)

但是,navigationItems被评估为字符串,而不是数组文字。知道如何做,或者这是否可能?

谢谢。

Kev*_*ell 8

我不太确定你想要实现什么目标。看起来您想要循环一个名为 的数组items并将其复制到一个名为 的新数组中navigationItems。也许items包含的键比您想要传递给宏的键多?

我将做出这个假设,否则你可以简单地复制itemsnavigationItems这样的:

{% set navigationItems = items %}

这个例子有效:

{% macro navigation(items) %}
    <ul>
        {% for item in items %}
            <li>{{ item.name }} - {{ item.url }}</li>
        {% endfor %}
    </ul>
{% endmacro %}

{% set websites = [
    {
        name: 'Google',
        url: 'http://google.com',
        description: 'A search engine'
    },
    {
        name: 'GitHub',
        url: 'http://github.com',
        description: 'A webapp for your git repos'
    },
    {
        name: 'StackOverflow',
        url: 'http://stackoverflow.com',
        description: 'The answer: 42'
    }] %}

{% set navigationItems = [] %}
{% for website in websites %}
    {% set navigationItems = (navigationItems.push({name: website.name, url: website.url}), navigationItems) %}
{% endfor %}

{{ navigation(items=navigationItems) }}
Run Code Online (Sandbox Code Playgroud)

websites值包含description未传递到navigationItems数组的键。如果是我,我会website直接传递给navigation宏,因为你的 key:nameurl在两个数组中都是相同的。

这里的模式几乎就像mapJavascript 或 Ruby 中的方法。