如何使用 Mustache 模板从字符串列表中获取术语子句的动态列表

How to get a dynamic list of term clauses from a list of strings using Moustache template

我有一个字符串列表,例如items = ["red", "green", "blue", ...] 并且我想使用模板来获取

"should": [
  {
    "term": {
      "mycolor": "red"
    }
  },
  {
    "term": {
      "mycolor": "green"
    }
  },
  {
    "term": {
      "mycolor": "blue"
    }
  },
  ...
]

现在我正在尝试

"should": [
  {{#items}}
  {
    "term": {
      "mycolor" : "{{.}}"
    }
  },
  {{/items}}
]

但它不起作用,因为末尾会有一个尾随逗号。我怎样才能去掉尾随的逗号来完成这项工作?

我自己找到了答案。 Moustache 是一个“无逻辑”的模板工具,所以似乎没有比我在这里尝试的更好的选择了。如果您有更好的想法,请补充答案或评论。

要呈现多个术语子句并处理尾随逗号,我可以做到

"should": [
  {{#items}}
  {
    "term": {
      "mycolor" : "{{color}}"
    }
  }
  {{^last}},{{/last}}
  {{/items}}
]

其中项目是这样的对象列表

params: {
"items": [{
  "color": "red"
},
{
  "color": "green"
},
{
  "color": "blue",
  "last": 1
}]
}

使用 ^ 运算符,即“反转部分”,模板知道在出现“last”时不呈现逗号。

更高级的案例

如果您必须在某些现有条款之上添加此条款条款列表,例如在“mysize”

之上添加这些“mycolor”术语
"should": [
  {
    "term": {
      "mycolor": "red"
    }
  },
  {
    "term": {
      "mycolor": "green"
    }
  },
  {
    "term": {
      "mycolor": "blue"
    }
  },
  {
    "term": {
      "mysize": "xl"
    }
  },
  {
    "term": {
      "mysize": "l"
    }
  },
  ...
]

您将需要处理任一列表为空的情况,并处理是否在它们之间添加逗号,即如果“mysize”列表不为空,“mycolor”应该有尾随逗号,否则没有。在这种情况下,我们需要根据第二个列表是否为空来呈现单个逗号。如果我们使用第二个列表 sizes 作为标签,它不起作用,因为 Mustache 将渲染逗号 N 次,其中 N 是 sizes 的长度。据我所知,无法根据非空列表呈现 once。所以我必须引入另一个参数 sizesExist 并在你的代码中设置它。

"should": [
  {{#colors}}
  {
    "term": {
      "mycolor" : "{{color}}"
    }
  }
  {{^last}},{{/last}}
  {{#sizesExist}},{{/sizesExist}}
  {{/colors}}
  {{#sizes}}
  {
    "term": {
      "mysize" : "{{size}}"
    }
  }
  {{^last}},{{/last}}
  {{/sizes}}
]

params: {
  "colors": [...],
  "sizes": [...],
  "sizesExist": true
}