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

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

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

Чтобы перебрать и вывести каждый элемент массива, можно использовать хелпер #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

В начало ↑

Была ли статья полезна?

Да Нет