gpt4 book ai didi

multidimensional-array - 使用模板包检查嵌套数组中是否存在值

转载 作者:IT王子 更新时间:2023-10-29 00:44:21 25 4
gpt4 key购买 nike

使用 text/template,我需要找出数组中的任何对象是否具有某个属性值。

假设我有一个人员列表 (json):

[
{"name": "ANisus", "sex":"M"},
{"name": "Sofia", "sex":"F"},
{"name": "Anna", "sex":"F"}
]

使用模板,我想要这样的输出:

Females:
Sofia
Anna

但标题 Females: 只应在确实有任何人将 sex 设置为 F 时显示。我如何在模板系统中执行此操作?我的第一次尝试是使用变量:

{{$hasFemale := 0}}
{{range .}}{{if eq .sex "F"}}{{$hasFemale := 1}}{{end}}{{end}}
{{if $hasFemale}}Female:{{end}}

我没有让它工作,因为范围内的 $hasFemale 处于不同的范围内,与以 0 启动的范围不同。我似乎无法找到一种方法来更改变量,一旦它是发起。

“工作”示例:http://play.golang.org/p/T-Ekx7n9YQ

而且我无法将此逻辑移至应用程序;它必须在模板中完成。

最佳答案

我会以不同的方式解决这个问题。您通常不需要模板中的状态,它们应该很简单。

因为您只想知道您的数据集中是否有女性,请在您的数据上定义一个方法 HasFemales 并从模板中调用它。您不一定需要定义结构,您可以使用自定义类型和这样的定义 ( your modified example on play ):

type People []interface{}

func (p People) HasFemale() bool {
for _, v := range p {
if m, ok := v.(map[string]interface{}); !ok {
return false
} else if _, ok := m["sex"]; ok && m["sex"] == "F" {
return true
}
}
return false
}

您的模板将如下所示:

{{if .HasFemale}}Female:
{{range .}}{{if eq .sex "F"}}{{.name}}{{end}}{{end}}
{{end}}

当然,这不像结构那样类型安全,也不像结构那么好,所以我建议使用 encoding/json 反射特性将值映射到结构并在其上定义方法。这还有一个好处,就是能够在内部缓存 .HasFemale 的结果,因此您无需每次都进行迭代。

关于您的评论的更新:

I have my Go application that takes two arguments: 1) a template file and 2) a json file. It executes the template with the data and outputs the file. The output file is then passed on to wkhtmltopdf to generade a pdf. Each template/data pair have arbitrary data structures beyond my control, so the Go application must be generic

在这种情况下,使 HasFemale 通用。这类似于您在问题中所做的,但有利于抽象范围的嵌套,使您可以将结果存储在变量中并在整个模板中拥有状态。示例:

type Data []interface{}

func (p Data) HasField(name string, value interface{}) bool {
for _, v := range p {
if m, ok := v.(map[string]interface{}); !ok {
return false
} else if _, ok := m[name]; ok && reflect.DeepEqual(m[name], value) {
return true
}
}
return false
}

示例用法:

{{$hasFemale := .HasField "sex" "F"}}
{{if $hasFemale}}Female:
{{range .}}{{if eq .sex "F"}}{{.name}}{{end}}{{end}}
{{end}}`

关于multidimensional-array - 使用模板包检查嵌套数组中是否存在值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19291365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com