【问题标题】:How to get unique nested array items in Nunjucks (11ty) and loop over it?如何在 Nunjucks (11ty) 中获取唯一的嵌套数组项并对其进行循环?
【发布时间】:2021-06-06 14:24:30
【问题描述】:

我有来自以下类型的无头 CMS 的数据:

type Assortiment = {
  list: Array<Item>
  // ...
}

type Item = {
  brands: Array<Brand>
  // ...
}

type Brand = {
  logo: string,
  title: string,
}

如您所见,有一个分类条目列表,每个条目都有自己的品牌列表。我需要遍历所有 unique 品牌并使用 nunjucks 在页面上显示它们。

我尝试为此编写一个自定义过滤器,但无法让它在 nunjucks 循环中工作。 JS 应该是这样的:

eleventyConfig.addFilter('uniqueBrands', (assortiment) => {
  const brands = assortiment.list.flatMap(item => item.brands)
  const map = new Map(brands.map(b => [b.logo, b.title]))

  return [...map.entries()]
})

我想如何使用它:

<ul>
  <!-- not sure if I apply a filter correctly below... -->
  {% for logo, title in (assortiment.list | uniqueBrands) %}
    <li>
      <img src="{{logo}}" alt="{{title}}" title="{{title}}" />
    </li>
  {% endfor %}
</ul>

我的技术栈是 11ty + Nunjucks + Netlify CMS。
看来我正在尝试滥用 nunjucks 过滤器,如果是这样,否则怎么办?


得到它的工作,最终解决方案:

// filters
cfg.addFilter('flatMap', (list, key) => list.flatMap((x) => x[key]))

cfg.addFilter('unique', (list, key) => {
  const map = new Map(list.map((x) => [x[key], x]))

  return [...map.values()]
})

// render
<ul>
  {% for brand in (assortiment.list | flatMap('brands') | unique('logo')) %}
  <li>
    <img src="{{brand.logo}}" alt="{{brand.title}}" />
  </li>
  {% endfor %}
</ul>

【问题讨论】:

    标签: javascript nunjucks eleventy


    【解决方案1】:

    不确定您缺少什么,您的代码看起来不错。您可以使用pipe operator 在 Nunjucks 中应用过滤器:

    <ul>
      {% for logo, title in (assortiment | uniqueBrands) %}
        <li>
          <img src="{{ logo }}" alt="{{ title }}" title="{{ title }}">
        </li>
      {% endfor %}
    </ul>
    

    似乎我在尝试滥用 nunjucks 过滤器,如果是这样,否则怎么办?

    使用您的独特品牌创建collection 可能会更容易。您的 JS 代码可以保持几乎相同,但您需要使用集合 API 获取品牌列表。

    【讨论】:

    • {% for x in (data | myFilter) %} 是否可以循环自定义过滤器结果(假设过滤器返回一个数组)?
    • @amankkg 是的,应该可以。它不适合你吗?你看到什么输出?有任何错误消息吗?
    • 是的,它有效,看起来我第一次尝试时忽略了一些东西
    猜你喜欢
    • 2015-05-16
    • 2021-04-05
    • 2021-09-06
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多