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
を使う必要はない気がします。