【问题标题】:Dot notation in Nunjucks sorting isn't workingNunjucks 排序中的点符号不起作用
【发布时间】:2021-04-04 20:55:16
【问题描述】:

我将 Eleventy (11ty) 与 Nunjucks 一起使用。我有一些我正在尝试排序的 JSON 数据。 Jinja documentation says,您可以使用点符号按属性排序,但是当我尝试按 address.city 排序时,没有任何反应:

{% for item in testData|sort(attribute="address.city") %}
  {{ item.name }}
{% endfor %}

如果我不使用点符号/按顶级字段 (name) 进行排序,它确实工作:

{% for item in testData|sort(attribute="name") %}
  {{ item.name }}
{% endfor %}

我的测试数据(testData.json):

[
  {
    "name": "AAA",
    "address":
    {
      "city": "A?"
    },
    "salary": 2,
    "married": true
  },
  {
    "name": "III",
    "address": {
      "city": "D?"
    },
    "salary": 1,
    "married": true
  }
]

【问题讨论】:

  • sort 中对点表示法的支持尚未发布。已经是merged
  • Jinja 是一系列模板语言中通用语法的实现; Nunjucks 是另一个。 Jinja 实现具有某种特性这一事实并不意味着 Nunjucks 也具有它。
  • @lxg — 感谢您的澄清。 Nunjucks templating documentation 说“Nunjucks 本质上是 jinja2 的一个端口,所以如果你发现这里缺少任何东西,你可以阅读他们的文档。”这就是让我相信 Jinja 中出现的功能也会出现在 Nunjucks 中的原因。
  • 我有一些 research 的过滤器支持 Nunjucks,如果你有兴趣的话。
  • 谢谢,@LeshaOgonkov!我要收藏它。

标签: nunjucks eleventy


【解决方案1】:

因此,正如我的问题的 cmets 所示,Nunjucks 目前不支持按点符号排序。

为了在 Eleventy 的 Nunjucks 模板中获得所需的内容,我最终所做的是在 .eleventy.js 内部创建一个 custom filter,如下所示:

eleventyConfig.addFilter("sortByCity", arr => {
  arr.sort((a, b) => (a.address.city) > (b.address.city) ? 1 : -1);
  return arr;
});

然后,在我的 Nunjucks 模板中:

{% for item in testData | sortByCity %}
  {{ item.name }}
{% endfor %}

我知道这个答案更针对 11ty,但我认为这很可能适用于其他环境以扩展 Nunjucks。希望这对将来的其他人有所帮助。 Nunjucks docs about Filters are here

【讨论】:

  • 很好,我会考虑使用 lodash 的更通用的过滤器!
猜你喜欢
  • 2018-11-24
  • 2016-05-26
  • 2023-04-08
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多