メインコンテンツまで移動する

Nunjucks で作る JSON で末尾以外にカンマを出力する方法

  • 公開日

Akira Web クリエイター

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 のカンマのために、あえて lastfirst を使う必要はない気がします。

フォローする