Nunjucks で作る JSON で末尾以外にカンマを出力する方法
JavaScript テンプレートエンジン Nunjucks で JSON を作る方法です。
例えば、このような配列があるとします。
{% set people = ['花子', '太郎', 'ジョン'] %}
この配列を for
で回し、このような JSON を作るとします。
[
{
"name": "花子"
},
{
"name": "太郎"
},
{
"name": "ジョン"
}
]
どうやって末尾以外に ,
を入れるのでしょうか。
[
{
"name": "花子"
}, ← ここはカンマがいる
{
"name": "太郎"
}, ← ここはカンマがいる
{
"name": "ジョン"
} ← ここはカンマがいらない
]
方法は、主に 3 つあります。
1 つ目が joiner()
です。最初の項目以外にカンマを出力する関数です。
{% set people = ['花子', '太郎', 'ジョン'] %}
{% set comma = joiner() %}
[
{% for person in people %}
{{ comma() }}
{
"name": "{{ person }}"
}
{% endfor %}
]
2 つ目が、for
のループ内で使える loop.last
です。最後の反復以外にカンマを出力できます。後で見返した時に分かりやすいため、私のお気に入りです。
{% set people = ['花子', '太郎', 'ジョン'] %}
[
{% for person in people %}
{
"name": "{{ person }}"
}
{{ ',' if not loop.last }}
{% endfor %}
]
loop.first
も使えます。joiner()
と同じく、最初の反復以外にカンマを出力できます。
{% set people = ['花子', '太郎', 'ジョン'] %}
[
{% for person in people %}
{{ ',' if not loop.first }}
{
"name": "{{ person }}"
}
{% endfor %}
]
3 つ目が last
です。配列の最後の項目以外にカンマを出力できます。
{% set people = ['花子', '太郎', 'ジョン'] %}
[
{% for person in people %}
{
"name": "{{ person }}"
}
{{ ',' if not (person === people | last) }}
{% endfor %}
]
ただ、配列の中がオブジェクトの場合は分かりにくいです。
{% set people = [
{ name: '花子', age: '21' },
{ name: '太郎', age: '25' },
{ name: 'ジョン', age: '23' }
] %}
[
{% for person in people %}
{
"name": "{{ person.name }}",
"age": "{{ person.age }}"
}
{{ ',' if not (person.name === (people | last).name) }}
{% endfor %}
]
first
でも last
と同じように使えます。ただ、JSON のカンマのために、あえて last
や first
を使う必要はない気がします。