Ітерація через карту в шаблоні


94

Я намагаюся показати список занять у спортзалі (йога, пілатес тощо). Для кожного типу занять існує кілька занять, тому я хочу згрупувати всі заняття з йоги, усі заняття з пілатесу тощо.

Я зробив цю функцію, щоб взяти фрагмент і скласти його карту

func groupClasses(classes []entities.Class) map[string][]entities.Class {
    classMap := make(map[string][]entities.Class)
    for _, class := range classes {
        classMap[class.ClassType.Name] = append(classMap[class.ClassType.Name], class)
    }
    return classMap
}

Проблема зараз полягає в тому, як я можу перебирати його, згідно з http://golang.org/pkg/text/template/ , вам потрібно отримати доступ до нього у .Keyформаті, я не знаю ключів (якщо я також не передав фрагмент ключів у шаблон). Як розпакувати цю карту на мій погляд.

Все, що я маю зараз

{{ . }} 

який відображає щось на зразок:

map[Pilates:[{102 PILATES ~/mobifit/video/ocen.mpg 169 40 2014-05-03 23:12:12 +0000 UTC 2014-05-03 23:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC {PILATES Pilates 1 2014-01-22 21:46:16 +0000 UTC} {1 leebrooks0@gmail.com password SUPERADMIN Lee Brooks {Male true} {1990-07-11 00:00:00 +0000 UTC true} {1.85 true} {88 true} 2014-01-22 21:46:16 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false} {0001-01-01 00:00:00 +0000 UTC false}} [{1 Mat 2014-01-22 21:46:16 +0000 UTC}]} {70 PILATES ~/mobifit/video/ocen.mpg 119 66 2014-03-31 15:12:12 +0000 UTC 2014-03-31 15:12:12 +0000 UTC 1899-12-30 00:00:00 +0000 UTC 

Відповіді:


169

Перевірте розділ Змінні в документах шаблону Go. Діапазон може оголошувати дві змінні, розділені комою. Має працювати наступне:

{{ range $key, $value := . }}
   <li><strong>{{ $key }}</strong>: {{ $value }}</li>
{{ end }}

47

Як зазначив Герман, ви можете отримати індекс та елемент з кожної ітерації.

{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}

Робочий приклад:

package main

import (
    "html/template"
    "os"
)

type EntetiesClass struct {
    Name string
    Value int32
}

// In the template, we use rangeStruct to turn our struct values
// into a slice we can iterate over
var htmlTemplate = `{{range $index, $element := .}}{{$index}}
{{range $element}}{{.Value}}
{{end}}
{{end}}`

func main() {
    data := map[string][]EntetiesClass{
        "Yoga": {{"Yoga", 15}, {"Yoga", 51}},
        "Pilates": {{"Pilates", 3}, {"Pilates", 6}, {"Pilates", 9}},
    }

    t := template.New("t")
    t, err := t.Parse(htmlTemplate)
    if err != nil {
        panic(err)
    }

    err = t.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }

}

Вихід:

Pilates
3
6
9

Yoga
15
51

Дитячий майданчик: http://play.golang.org/p/4ISxcFKG7v


Привіт @ANisus, у мене є вимога генерувати json за допомогою шаблону, як показано нижче, але він також має додаткові коми, як у масиві адрес у наведеному прикладі Вихід `` {"name": "Mus", "adresses": [{"address ":" A "}, {" address ":" B "},]}` `` Посилання на приклад коду play.golang.org/p/nD08y0noPHv
Мохаммад Мустакім

1
@MohammadMustaqeem Ви можете перевірити індекс кожної ітерації, а не додавати коми на першій ітерації. Див. Приклад: play.golang.org/p/5544hc_0_g8 . Тільки будь обережний. Візуалізація JSON за допомогою шаблонів призведе до уникнення проблем. Дивіться додану мною адресу "C&D".
Аніс,

Дякую. Я вирішив цю проблему, імпортуючи "текст / шаблон" замість "html / шаблон". play.golang.org/p/PXTNZGWx7Yi
Мохаммад Мустакім

1
@MohammadMustaqeem На жаль, тепер ви можете отримати недійсний JSON або, що ще гірше, введений JSON: play.golang.org/p/kd9bM_rpwyg . Використовувати шаблон для генерації json нерозумно, але якщо доведеться, уникайте значень JSON за допомогою таких функцій, як js (також у цьому прикладі).
Анісус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.