วนซ้ำผ่านแผนที่ในเทมเพลต


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 

คำตอบ:


171

ตรวจสอบส่วนตัวแปรในเอกสารเทมเพลต 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
Mohammad Mustaqeem

1
@MohammadMustaqeem คุณสามารถตรวจสอบดัชนีของการวนซ้ำแต่ละครั้งและไม่ต้องใส่เครื่องหมายจุลภาคในการทำซ้ำครั้งแรก ดูตัวอย่าง: play.golang.org/p/5544hc_0_g8 เพียงแค่ระวัง. การแสดงผล JSON ด้วยเทมเพลตจะทำให้เกิดปัญหาในการหลบหนี ดูที่อยู่ "C&D" ที่ฉันเพิ่ม
ANisus

ขอบคุณ. ฉันได้แก้ไขปัญหาการหลบหนีโดยการนำเข้า "text / template" แทน "html / template" play.golang.org/p/PXTNZGWx7Yi
Mohammad Mustaqeem

1
@MohammadMustaqeem แต่น่าเสียดายที่ตอนนี้คุณอาจได้รับ JSON ที่ไม่ถูกต้องหรือแม้แต่เลวฉีด JSON: play.golang.org/p/kd9bM_rpwyg การใช้เทมเพลตเพื่อสร้าง json นั้นไม่ฉลาด แต่ถ้าคุณต้องหลีกเลี่ยงค่า JSON ด้วยฟังก์ชันเช่น js (เช่นในตัวอย่างนี้)
ANisus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.