简体   繁体   中英

nunjucks set create object

As nunjucks now supports using set as a block I wanted to do something like this:

{% set navigationItems %}
  {% for item in items %}
    { name: item.name, url: item.url }{% if not loop.last %},{% endif %}
  {% endif %}
{% endset %}

Then call this variable as the input object on another macro, like so:

{{ navigation(items=[navigationItems]) }}

However, navigationItems is evaluated as a string, not an array-literal. Any idea how, or if this is possible?

Thanks.

I'm not exactly sure what you're trying to accomplish. It looks like you want to loop over one array called items and copy it into a new array called navigationItems . Perhaps items contains more keys than you want to pass to the macro?

I'm going to make that assumption, otherwise you could simply copy items into navigationItems like so:

{% set navigationItems = items %}

This example works:

{% 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) }}

websites values contain a description key which is not passed on to the navigationItems array. If it were me, I'd just pass website directly to the navigation macro since your keys: name and url are the same in both arrays.

The pattern here is almost like a map method in Javascript or Ruby.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM