Как работать с массивами и списками

Вывод массивов

Чтобы перебрать и вывести каждый элемент массива, можно использовать хелпер #each.
Представьте, что вы сделали запрос в свою систему учета клиентов, получили из нее список имен сотрудников и записали его в переменную names. Мы хотим сделать так, чтобы одного из сотрудников клиент мог выбрать.
Внутри переменной names этот список может выглядеть как-то так:
["Александрова Александра", "Иванов Иван", "Константинопольский Константин", "Ярослава Ярославна"]
Каждый элемент массива внутри #each доступен как переменная this:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each names}}
{{this}}
{{/each}}
Клиенту придет сообщение:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

Александрова Александра
Иванов Иван
Константинопольский Константин
Ярослава Ярославна
Внутри #each также доступна специальная переменная @index — это порядковый номер элемента. Есть одна особенность — #each нумерует массивы от нуля:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each names}}
{{@index}}. {{this}}
{{/each}}
Получится:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

0. Александрова Александра
1. Иванов Иван
2. Константинопольский Константин
3. Ярослава Ярославна
Мы можем использовать внутри тела #each любые линейные хелперы и легко исправить нумерацию при помощи сложения с единицей:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each names}}
{{add @index 1}}. {{this}}
{{/each}}
Теперь получится текст таким, каким мы его и задумывали:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

1. Александрова Александра
2. Иванов Иван
3. Константинопольский Константин
4. Ярослава Ярославна

Объекты в массивах и списках

Внутри массивов могут быть не только простые данные вроде строк, как в прошлом примере. Там могут быть и вложенные объекты.
Допустим, мы попросили у вашей системы учета клиентов список сотрудников в виде объектов и записали его в переменную staff. Наш список в переменных может выглядеть как-то так:
[
  {
    "id": 12345,
    "name": "Александрова Александра",
    "rating": 5
  },
  {
    "id": 12346,
    "name": "Иванов Иван",
    "rating": 5
  },
  {
    "id": 12347,
    "name": "Константинопольский Константин",
    "rating": 3
  },
  {
    "id": 12348,
    "name": "Ярослава Ярославна",
    "rating": 4
  }
]
С такими списками мы можем работать точно также, как с простыми:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each staff}}
{{!-- this теперь — это не строка с именем, а имя текущего объекта --}}
{{!-- мы можем обратиться к внутренней переменной `name` через this.name --}}
{{add @index 1}}. {{this.name}}
{{/each}}
Как видите, все также просто, как и со строками.
Когда мы работаем с объектами внутри списков, мы можем опустить this и писать сразу имя внутренней переменной. Давайте дополнительно отправим клиенту рейтинг:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each staff}}
{{!-- можно опустить this --}}
{{add @index 1}}. {{name}} — рейтинг: {{rating}}
{{/each}}
Получится такое сообщение:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

1. Александрова Александра — рейтинг: 5
2. Иванов Иван — рейтинг: 5
3. Константинопольский Константин — рейтинг: 3
4. Ярослава Ярославна — рейтинг: 4
Если вдруг потребуется получить что-то из переменной вне массива, внутри #each мы можем вернуться наверх и прочитать нужную переменную с помощью ../.
Представьте, что мы спросили у клиента, какой рейтинг сотрудника его больше всего интересует, и хотим отправить все имена, где рейтинг совпадает или даже лучше. Снова представьте, что рейтинг который он прислал мы записали в переменную min:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

{{#each staff}}
{{!-- Комментарий: `../` — мы вышли из массива --}}
{{!-- Комментарий: `../min` — вышли из массива и получили `min` --}}
{{#gte rating ../min}}
{{!-- Комментарий: если `../min` равен или больше `rating` --}}
{{add @index 1}}. Вам может подойти {{name}}. Рейтинг: {{rating}}
{{else}}
{{!-- Комментарий: если `../min` меньше `rating` --}}
{{add @index 1}}. Кажется {{name}} вам не подходит. Рейтинг всего: {{rating}}
{{/gte}}
{{/each}}
Если min = 4, то получится такое сообщение:
Пришлите мне имя сотрудника, к которому вы хотите записаться:

1. Вам может подойти Александрова Александра. Рейтинг: 5
2. Вам может подойти Иванов Иван. Рейтинг: 5
3. Кажется Константинопольский Константин вам не подходит. Рейтинг всего: 3
4. Вам может подойти Ярослава Ярославна. Рейтинг: 4